在 C++ 中打包嵌套结构
Packing nested structs in C++
使用 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(1)
将导致 sizeof(AAA) 为 15,sizeof(BBB) 为 16。
使用 #pragma pack(push, 1)
或 #pragma pack(1)
强制编译器不在 2 字节或 4 字节边界上排列结构成员,这使得处理器处理更容易和更快。因此该结构包含 秘密填充字节 来实现这一点。但是由于填充,这会增加内存使用量。
准确的解释here
使用 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(1)
将导致 sizeof(AAA) 为 15,sizeof(BBB) 为 16。
使用 #pragma pack(push, 1)
或 #pragma pack(1)
强制编译器不在 2 字节或 4 字节边界上排列结构成员,这使得处理器处理更容易和更快。因此该结构包含 秘密填充字节 来实现这一点。但是由于填充,这会增加内存使用量。
准确的解释here