sizeof
есть три структуры
{
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.
Размер структуры three: 8*4 + 9*8 = 104 байта.
почему
sizeof(one)=36,
sizeof(two)=64,
а sizeof(three)=104
Компилятор VC++ Express.
Насколько я помню, по умолчанию выравнивание в VC по границе 8 байт. Вот откуда и лишние 4 байта. Т.е. данные b начинаются на сразу за a, а через 4 байта.
Размер структуры three: 8*4 + 9*8 = 104 байта.
Круто завернул. :) А если так
{
int a[10];
double b[8];
};
выходит размер будет 8*4 + 10*8 = 112 байт?
Тогда выставь в настройках проекта выравнивание членов структур в 4 байта. Вот только как это отразится на проекте в целом и отразится ли вообще - это вопрос.
Лень сейчас запускать студию, так что приблизительно это где-то: Properties->Compiler->Code Generation->Struct Member Alignment. Как-то так.
P.S. а если не секрет, зачем такая "точность"?
P.S. а если не секрет, зачем такая "точность"?
Заголовок SHP-файла весит ровно 100 байт, правда выглядит немного сложнее:)
P.S.
выставь в настройках проекта выравнивание членов структур в 4 байта
Как это сделать?-)
{
int a[10];
double b[8];
};
выходит размер будет 8*4 + 10*8 = 112 байт?
Я написал всё точно! Просто plastictown отредактировал свой первый пост.
А так, всё дело действительно в выравнивании.
P.S. а если не секрет, зачем такая "точность"?
На байтовый массив структуру натягивает. Либо регистры расписывает для более удобного доступа...
А так, всё дело действительно в выравнивании.
А. Тогда извиняюсь. Не видел первого поста. :)
[QUOTE=Gigahard]
Чтобы плотно упаковать члены структуры, без выравнивания, то нужно в настройках компилятора выставить выравнивание по одному байту, а не по 4. То что на данный момент имеете 104 байта вместо 100 как раз и есть результат текущей настройки выравнивания по 4 байта.
[/QUOTE]
Маленькая поправка, данные 104 байта как раз результат выравниваня именно 8 байт.
Как правило, по умолчанию компиляторы используют естественное выравнивание, а это ни есть 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
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
Не верите, проверьте.
Не верите, проверьте.
Верю, согласен. :)
Я имел в виду, что в данном конкретном случае "сыграло" роль именно /Zp (по умолчанию 8).
Извиняюсь, если не так выразился.