Упаковка вложенных структур в Stack Overflow

Используя 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.

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()
{
std::cout << sizeof(AAA) << "\n"; // gives 16
std::cout << sizeof(BBB) << "\n"; // gives 17
getchar();
return 0;
}
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,

0

использование #pragma pack(push, 1) или же #pragma pack(1) заставить компилятор не выстраивать элементы структуры на границах 2 или 4 байта, что делает его проще и быстрее обрабатывать процессор. Таким образом, структура содержит секретные байты заполнения чтобы это произошло. Но это увеличивает использование памяти из-за заполнения.

Это точное объяснение Вот

0

с помощью

#pragma pack(1)

приведет к sizeof (AAA) будет 15 и sizeof (BBB) ​​будет 16.

-1
По вопросам рекламы [email protected]