我的代码中有struct iof_header
,我确定它将是24字节宽。我执行sizeof(iof_header)并返回32字节宽。
问题1 为什么它是32字节而不是24?
问题2 包括其成员,如何将结构存储在内存中?
问题3
我发现任何时候我都会创建一个字节[4-8& 20-24]都是NULL,我在char数组中看到这一点。该数组如下所示{4 bytes of BASEID_Code, 4 NULL bytes, 8 bytes of zeroed padding, 4 bytes of ASID_Code, 4 NULL bytes, 8 bytes of size}
我的unsigned __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;
}
};
答案 0 :(得分:5)
为什么它是32字节而不是24?
可能是因为在每个__int64
成员之前添加了填充以满足其对齐要求。
包括其成员,结构如何存储在内存中?
成员按顺序存储,必要时插入填充,以便相对于结构的开头正确对齐每个成员。
某些编译器具有非标准扩展名来“封装”成员,因此不会插入填充。例如,在GCC上,您可以在结构定义之后添加__attribute__((packed))
。
使CPU能够更快地处理这些数据类型可能是一种有效的方法吗?
是。在某些处理器上,未对齐的访问速度很慢;在其他方面,它们根本不被允许,必须通过两次或多次访问来模拟。
答案 1 :(得分:2)
编译器可以在成员之后添加填充字节以保留对齐要求。您的__int64
成员可能会与8个字节对齐,而不是BASEID_Code
和padding
之间的4个填充字节。