Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中打包嵌套结构+;_C++_Struct_Size_Packing - Fatal编程技术网

C++ 在C+中打包嵌套结构+;

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) << "\

使用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;
}
struct AAA//15字节
{
双d;
短s;
半焦a1;
字符a2;
炭a3;
煤焦s4;
煤焦s5;
};
结构BBB
{
AAA d;
字符a4;
};
int main()
{
std::cout
struct AAA//15字节
{
双d;
短s;
半焦a1;
字符a2;
炭a3;
煤焦s4;
煤焦s5;
};
#布拉格语包(1)
结构BBB
{
AAA d;
字符a4;
};
int main()
{
std::cout
struct 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希望该行为无需打包。请参阅