使用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。
答案 0 :(得分:0)
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;
}
答案 1 :(得分: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
的对齐方式。
答案 2 :(得分:0)
使用#pragma pack(push, 1)
或#pragma pack(1)
强制编译器不要在2字节或4字节边界上排列结构成员,这使得处理器更容易和更快地处理。因此,该结构包含秘密填充字节以实现此目的。但是这会因填充而增加内存使用量。
它是一个精确的解释here
答案 3 :(得分:-1)
#pragma pack(1)
将导致sizeof(AAA)为15,sizeof(BBB)为16。