Форум программистов, компьютерный форум CyberForum.ru

Выделение памяти под структуры - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
22.08.2012, 08:49     Выделение памяти под структуры #1
Когда я только знакомился с кодингом на С(С++) я скачивал с инета очень много всякой литературы... Так вот... Недавно я начал заново перечитывать эти книжки(статьи), хотел проверить насколько я продвинулся. (лол че...) Наткнулся на такую вот инфу:

Когда sizeof применяются к имени типа структуры или объединения или к идентификатору имеющему тип структуры или объединения, то результатом является фактический размер структуры или объединения, который может включать участки памяти, используемые для выравнивания элементов структуры или объединения. Таким образом, этот результат может не соответствовать размеру, получаемому путем сложения размеров элементов структуры.
Ну автор привел пример:
C
1
2
3
4
5
6
 struct     { char   h;
                   int    b;
                   double f;
                 } str;
      int a1;
      a1  = sizeof(str);
После чего автор говорит:
Переменная а1 получит значение, равное 12, в то же время если сложить длины всех используемых в структуре типов, то получим, что длина структуры str равна 7.

Несоответствие имеет место в виду того, что после размещения в памяти первой переменной h длинной 1 байт, добавляется 1 байт для выравнивания адреса переменной b на границу слова (слово имеет длину 2 байта для машин серии IBM PC AT /286/287), далее осуществляется выравнивание адреса переменной f на границу двойного слова (4 байта), таким образом в результате операций выравнивания для размещения структуры в оперативной памяти требуется на 5 байт больше.

В связи с этим целесообразно рекомендовать при объявлении структур и объединения располагать их элементы в порядке убывания длины типов.
Ну я как тру-кодер решил проверить на своей машине
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
 
struct { 
    char   h;
    int    b;
    double f;
       } str;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a1;
 
    printf("size DWORD: %d \n", sizeof(DWORD)); //Следовательно, размер слова - 2 байта (быдло. че еще сказать... по другому не судьба определить)
    printf("size char: %d \n",sizeof(char));
    printf("size int: %d \n",sizeof(int));
    printf("size double: %d \n",sizeof(double));
    printf("size struct: %d \n",sizeof(str));
 
    system("pause");
    return 0;
}
Получил вот такое вот:
Выделение памяти под структуры

Компилятор, как вы поняли - Майкрософтовский (Вижуал студио)... Поясните что это за байда с выраниванием.... И например у меня тип double 8 байт, размер слова - 2 байта... 8/2 = 4 (ровно 4 слова, мы же как раз поместились... ) или тип int 4 байта, тоже влезли в 2 слова... Получается никакого выравнивания не должно быть. Только тип char - 1 байт(его выравнили до 2 байт)...
Итогодебит, кредит епт...)
2+4+8 = 14(а она 16 байт)
Что я упустил?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2012, 08:49     Выделение памяти под структуры
Посмотрите здесь:

Структуры. Динамическое выделение памяти C++
C++ Структуры и динамическое выделение памяти.
Выделение памяти под матрицу C++
выделение памяти под wchar_t C++
C++ выделение памяти под структуру
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
22.08.2012, 08:55     Выделение памяти под структуры #2
Тип char, int, double не трубуют выравнивания сами по себе. Выравниевание нужно в структурах/объединениях.
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
22.08.2012, 09:16  [ТС]     Выделение памяти под структуры #3
Ну так я спрашиваю - вот структура у меня получилась 16 байт... Откуда лишние байты взялись? Как она в памяти расположилась? Че там выравнивалось Я понимаю, что char, int, double не нужно отдельно выравнивать... А вот что с ними в структуре происходит? Откуда эти 16 байт берутся...
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
22.08.2012, 09:24     Выделение памяти под структуры #4
Размер слова на Вашей машине равен 4 байтам. 4 + 4 + 8 = 16.
_kod_
4 / 4 / 0
Регистрация: 24.10.2011
Сообщений: 84
22.08.2012, 09:26  [ТС]     Выделение памяти под структуры #5
оО Как? DWORD - это же double word(двойное слово). Ну и значит просто WORD - 2 байта Я не прав?
Пaтрик
 Аватар для Пaтрик
394 / 387 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
22.08.2012, 09:27     Выделение памяти под структуры #6
http://habrahabr.ru/post/90580/
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.08.2012, 09:31     Выделение памяти под структуры
Еще ссылки по теме:

Выделение памяти под указатель C++
Выделение памяти под массивы C++
Динамическое выделение памяти для структуры в функции C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
22.08.2012, 09:31     Выделение памяти под структуры #7
Цитата Сообщение от _kod_ Посмотреть сообщение
Ну так я спрашиваю - вот структура у меня получилась 16 байт... Откуда лишние байты взялись?
Цитата Сообщение от _kod_ Посмотреть сообщение
(слово имеет длину 2 байта для машин серии IBM PC AT /286/287),
ты все еще на 286???
начиная с 386
выравнивание равно 4 байтам(если иное не указано в настройках компилятора)

Добавлено через 1 минуту
Цитата Сообщение от _kod_ Посмотреть сообщение
оО Как? DWORD - это же double word(двойное слово). Ну и значит просто WORD - 2 байта
да
но С не знает что такое DWORD и WORD( это ассемблер)
Yandex
Объявления
22.08.2012, 09:31     Выделение памяти под структуры
Ответ Создать тему
Опции темы

Текущее время: 17:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru