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我搜索了一下,找不到答案。我贴了。帮助堆栈溢出改进其搜索算法;除此之外,我不知道该说什么。对不起,我想是吧?谢谢,这对我的理解很有帮助。我通过反复试验修正了它。