C++ 在C+中打包嵌套结构+;
使用Visual Studio 2017,以下内容给出了C++ 在C+中打包嵌套结构+;,c++,struct,size,packing,C++,Struct,Size,Packing,使用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) << "\
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;
}
struct AAA//15字节
{
双d;
短s;
半焦a1;
字符a2;
炭a3;
煤焦s4;
煤焦s5;
};
结构BBB
{
AAA d;
字符a4;
};
int main()
{
std::coutstruct AAA//15字节
{
双d;
短s;
半焦a1;
字符a2;
炭a3;
煤焦s4;
煤焦s5;
};
#布拉格语包(1)
结构BBB
{
AAA d;
字符a4;
};
int main()
{
std::coutstruct AAA//15字节
{
双d;
短s;
半焦a1;
字符a2;
炭a3;
煤焦s4;
煤焦s5;
};
#布拉格语包(1)
结构BBB
{
AAA d;
字符a4;
};
int main()
{
std::cout尝试以下代码:
#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;
}
structs
和unions
具有更严格的对齐要求,以确保一致的聚合和union
存储和数据检索。建议对unions
和structures
的标量成员进行对齐。
结构尺寸必须是其对齐的整数倍,这可能需要在最后一个构件后填充
#pragma pack
语句更改结构的对齐方式
尝试以下代码:
#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;
}
structs
和unions
具有更严格的对齐要求,以确保一致的聚合和union
存储和数据检索。建议对unions
和structures
的标量成员进行对齐。
结构尺寸必须是其对齐的整数倍,这可能需要在最后一个构件后填充
#pragma pack
语句使用
#pragma pack(1)
将结果转化为sizeof(AAA)为15,sizeof(BBB)为16。使用
#pragma pack(1)
将结果转化为sizeof(AAA)为15,sizeof(BBB)为16。使用#pragma pack(push,1)
或#pragma pack(1)
强制编译器不在2字节或4字节边界上排列结构成员,这使处理器更容易、更快地处理。因此,结构包含秘密填充字节以实现这一点。但由于填充,这会增加内存使用量
这是一个精确的解释使用#pragma pack(push,1)
或#pragma pack(1)
强制编译器不在2字节或4字节边界上排列结构成员,这使处理器更容易、更快地处理。因此,结构包含秘密填充字节以实现这一点。但由于填充,这会增加内存使用量
这是一个精确的解释查找#pragma pack
,如果仅此一项不能解决问题,可能还会有相关的问题。查找#pragma pack
,如果仅此一项不能解决问题,可能还会有相关的问题。问题是字符a4
正好适合最后一个填充字节,但编译器不允许打包it放入该位置。看起来OP希望该行为无需打包。请参阅,char a4
正好适合最后一个填充字节,但编译器不允许将其打包到该位置。看起来OP希望该行为无需打包。请参阅