Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

sizeof

311
01 октября 2009 года
plastictown
309 / / 08.01.2006
Объясните, пожалуйста, такую вещь:

есть три структуры

Код:
struct one
{
   int a[9];
};
 
struct two
{
   double b[8];
};
 
struct three
{
   int a[9];
   double b[8];
};


почему
sizeof(one)=36,
sizeof(two)=64,
а sizeof(three)=104

Компилятор VC++ Express.
297
01 октября 2009 года
koodeer
1.2K / / 02.05.2009
Имхо, всё верно. Размер типа int - 4 байта, типа double - 8 байт.
Размер структуры three: 8*4 + 9*8 = 104 байта.
288
01 октября 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: plastictown

почему
sizeof(one)=36,
sizeof(two)=64,
а sizeof(three)=104

Компилятор VC++ Express.



Насколько я помню, по умолчанию выравнивание в VC по границе 8 байт. Вот откуда и лишние 4 байта. Т.е. данные b начинаются на сразу за a, а через 4 байта.

288
01 октября 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: koodeer
Имхо, всё верно. Размер типа int - 4 байта, типа double - 8 байт.
Размер структуры three: 8*4 + 9*8 = 104 байта.



Круто завернул. :) А если так

 
Код:
struct three
{
   int a[10];
   double b[8];
};


выходит размер будет 8*4 + 10*8 = 112 байт?
311
01 октября 2009 года
plastictown
309 / / 08.01.2006
А если мне надо, чтобы эта конструкция ыесила ровно 100 байт?
288
01 октября 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: plastictown
А если мне надо, чтобы эта конструкция ыесила ровно 100 байт?



Тогда выставь в настройках проекта выравнивание членов структур в 4 байта. Вот только как это отразится на проекте в целом и отразится ли вообще - это вопрос.

Лень сейчас запускать студию, так что приблизительно это где-то: Properties->Compiler->Code Generation->Struct Member Alignment. Как-то так.

P.S. а если не секрет, зачем такая "точность"?

311
01 октября 2009 года
plastictown
309 / / 08.01.2006
Цитата: nikitozz

P.S. а если не секрет, зачем такая "точность"?



Заголовок SHP-файла весит ровно 100 байт, правда выглядит немного сложнее:)

P.S.

Цитата:

выставь в настройках проекта выравнивание членов структур в 4 байта



Как это сделать?-)

602
01 октября 2009 года
KPI Student
265 / / 16.12.2006
Есть замечательная штука #pragma pack, читайте мануал, и будет вам счастье ;)

 
Код:
см. MSDN - #pragma directives, C/C++
297
01 октября 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: nikitozz
Круто завернул. :) А если так
 
Код:
struct three
{
   int a[10];
   double b[8];
};


выходит размер будет 8*4 + 10*8 = 112 байт?



Я написал всё точно! Просто plastictown отредактировал свой первый пост.
А так, всё дело действительно в выравнивании.

590
01 октября 2009 года
Gigahard
223 / / 03.04.2006
Как уже написали, дело в выравнивании байт. Чтобы плотно упаковать члены структуры, без выравнивания, то нужно в настройках компилятора выставить выравнивание по одному байту, а не по 4. То что на данный момент имеете 104 байта вместо 100 как раз и есть результат текущей настройки выравнивания по 4 байта.
590
01 октября 2009 года
Gigahard
223 / / 03.04.2006
Цитата: nikitozz

P.S. а если не секрет, зачем такая "точность"?



На байтовый массив структуру натягивает. Либо регистры расписывает для более удобного доступа...

288
02 октября 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: koodeer
Я написал всё точно! Просто plastictown отредактировал свой первый пост.
А так, всё дело действительно в выравнивании.



А. Тогда извиняюсь. Не видел первого поста. :)

[QUOTE=Gigahard]
Чтобы плотно упаковать члены структуры, без выравнивания, то нужно в настройках компилятора выставить выравнивание по одному байту, а не по 4. То что на данный момент имеете 104 байта вместо 100 как раз и есть результат текущей настройки выравнивания по 4 байта.
[/QUOTE]

Маленькая поправка, данные 104 байта как раз результат выравниваня именно 8 байт.

590
02 октября 2009 года
Gigahard
223 / / 03.04.2006
Да, скорей всего по умолчанию стоит QWORD (Quad word) выравнивание. Для 32 битной системы - 8 байт.
260
04 октября 2009 года
Ramon
1.1K / / 16.08.2003
Цитата: Gigahard
Да, скорей всего по умолчанию стоит QWORD (Quad word) выравнивание. Для 32 битной системы - 8 байт.



Как правило, по умолчанию компиляторы используют естественное выравнивание, а это ни есть 8 байт.

288
05 октября 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: Ramon
Как правило, по умолчанию компиляторы используют естественное выравнивание, а это ни есть 8 байт.



Эм, вообще-то в студии (а речь именно о ней) по умолчанию все же 8 байт. :)
[QUOTE=MSDN;]
The available values are described in the following table.
1
Packs structures on 1-byte boundaries. Same as /Zp.
2
Packs structures on 2-byte boundaries.
4
Packs structures on 4-byte boundaries.
8
Packs structures on 8-byte boundaries (default).
16
Packs structures on 16-byte boundaries.
[/QUOTE]

http://msdn.microsoft.com/en-us/library/xh3e3fd0(VS.80).aspx

260
05 октября 2009 года
Ramon
1.1K / / 16.08.2003
Читали, читали да не вычитали.:(

Цитата:

Without __declspec(align(#)), Visual C++ aligns data on natural boundaries based on the size of the data, for example 4-byte integers on 4-byte boundaries and 8-byte doubles on 8-byte boundaries. Data in classes or structures is aligned within the class or structure at the minimum of its natural alignment and the current packing setting (from #pragma pack or the /Zp compiler option).



http://msdn.microsoft.com/en-us/library/83ythb65(VS.80).aspx

Не верите, проверьте.

288
05 октября 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: Ramon

Не верите, проверьте.



Верю, согласен. :)
Я имел в виду, что в данном конкретном случае "сыграло" роль именно /Zp (по умолчанию 8).
Извиняюсь, если не так выразился.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог