Используя Visual Studio 2017, следующее дает …
struct AAA // 15 bytes
{
double d;
short s;
char a1;
char a2;
char a3;
char s4;
char s5;
};
struct BBB
{
AAA d;
char a4;
};
int main()
{
std::cout << sizeof(AAA) << "\n"; // gives 16
std::cout << sizeof(BBB) << "\n"; // gives 24
getchar();
return 0;
}
Вопрос в том … как мне получить sizeof (BBB) равным 16.
struct AAA // 15 bytes
{
double d;
short s;
char a1;
char a2;
char a3;
char s4;
char s5;
};
#pragma pack(1)
struct BBB
{
AAA d;
char a4;
};
int main()
{
std::cout << sizeof(AAA) << "\n"; // gives 16
std::cout << sizeof(BBB) << "\n"; // gives 17
getchar();
return 0;
}
Попробуйте с кодом ниже:
#pragma pack(1)
struct AAA // 15 bytes
{
double d;
short s;
char a1;
char a2;
char a3;
char s4;
char s5;
};
#pragma pack(1)
struct BBB
{
AAA d;
char a4;
};
int main(int argc, char *argv[])
{
std::cout << sizeof(AAA) << "\n"; // gives 15
std::cout << sizeof(BBB) << "\n"; // gives 16
getchar();return 0;
}
Результатом будет:
15
16
structs
, а также unions
иметь более строгие требования к выравниванию, которые обеспечивают согласованную совокупность и union
хранение и поиск данных. Предложено выравнивание для скалярных членов unions
а также structures
,
Размер структуры должен быть кратным ее выравниванию, что может потребовать заполнения после последнего элемента.
#pragma pack
Заявление изменить выравнивание structure
,
использование #pragma pack(push, 1)
или же #pragma pack(1)
заставить компилятор не выстраивать элементы структуры на границах 2 или 4 байта, что делает его проще и быстрее обрабатывать процессор. Таким образом, структура содержит секретные байты заполнения чтобы это произошло. Но это увеличивает использование памяти из-за заполнения.
Это точное объяснение Вот
с помощью
#pragma pack(1)
приведет к sizeof (AAA) будет 15 и sizeof (BBB) будет 16.