Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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++_Arrays_Struct_Null_Unions - Fatal编程技术网

C++ 结构如何存储在内存中?

C++ 结构如何存储在内存中?,c++,arrays,struct,null,unions,C++,Arrays,Struct,Null,Unions,我的代码中有一个struct iof_头,我确定它的宽度为24字节。我执行sizeof(iof_头),它返回32字节宽 问题1 为什么它的宽度是32字节而不是24字节 问题2 包括其成员在内,结构如何存储在内存中 问题3 我发现每当我创建一个结构时,字节[4-8&20-24]都是空的,这在我的char数组中很明显。数组的读取方式如下{4字节的BASEID\u代码、4个空字节、8字节的零填充、4字节的ASID\u代码、4个空字节、8字节的大小} 我的unsigned\u int32成员的末尾有空字

我的代码中有一个
struct iof_头
,我确定它的宽度为24字节。我执行sizeof(iof_头),它返回32字节宽

问题1 为什么它的宽度是32字节而不是24字节

问题2 包括其成员在内,结构如何存储在内存中

问题3 我发现每当我创建一个结构时,字节[4-8&20-24]都是空的,这在我的char数组中很明显。数组的读取方式如下{4字节的BASEID\u代码、4个空字节、8字节的零填充、4字节的ASID\u代码、4个空字节、8字节的大小} 我的
unsigned\u int32
成员的末尾有空字节,为什么会发生这种情况

这可能与编译有关吗?使CPU能够更快地处理这些数据类型,这可能是一种高效的方法吗

struct                      iof_header
{
    union
    {
        struct
        {
            unsigned __int32        BASEID_Code;
            unsigned __int64        padding;
            union
            {
                char                    ASID_Type[4];
                unsigned __int32        ASID_Code;
            };
            unsigned __int64        Size;
        }header;
        char                    header_c[24];
    };
    iof_header()
    {
        header.ASID_Code = 0;
        header.BASEID_Code = 0;
        header.Size = 0;
        header.padding = 0;
    }
};

编译器可以在成员之后自由添加填充字节,以保留对齐要求。您的
\uuuu int64
成员可能与8个字节对齐,因此在
BASEID\u code
padding
之间有4个填充字节

为什么它的宽度是32字节而不是24字节

可能是因为在每个
\uuu int64
成员之前添加了填充,以满足其对齐要求

包括其成员在内,结构如何存储在内存中

构件按顺序存储,并在必要时插入填充,以相对于结构起点正确对齐每个构件

一些编译器有一个非标准的扩展来“打包”成员,这样就不会插入填充。例如,在GCC上,您可以在结构定义之后放置
\uuuuuuuuuuuuuuu属性((打包))

使CPU能够更快地处理这些数据类型,这可能是一种高效的方法吗

struct                      iof_header
{
    union
    {
        struct
        {
            unsigned __int32        BASEID_Code;
            unsigned __int64        padding;
            union
            {
                char                    ASID_Type[4];
                unsigned __int32        ASID_Code;
            };
            unsigned __int64        Size;
        }header;
        char                    header_c[24];
    };
    iof_header()
    {
        header.ASID_Code = 0;
        header.BASEID_Code = 0;
        header.Size = 0;
        header.padding = 0;
    }
};

对。在某些处理器上,未对齐的访问速度较慢;在其他情况下,它们是完全不允许的,必须通过两个或多个访问来模拟。

一个事物的
联合
和一个
字符[32]
的大小怎么可能小于32字节?请阅读此文进行解释-这已经被询问和回答了一百万次。你的三个问题。如果有的话,你应该单独发布。@larsmans对不起,我忘了把数组改回去。我已经修正了密码。通过试用和测试,我找到了两种解决空字节的方法error@LightnessRacesinOrbit我搜索了一下,找不到答案。我贴了。帮助堆栈溢出改进其搜索算法;除此之外,我不知道该说什么。对不起,我想是吧?谢谢,这对我的理解很有帮助。我通过反复试验修正了它。