结构体内存对齐问题
- 结构体内成员按照声明顺序存储,第一个成员地址和整个结构体地址相同。
- 未特殊说明时,按结构体中size最大的成员对齐(若有double成员,按8字节对齐。)
c++11以后引入两个关键字 alignas
与 [alignof]
。其中alignof
可以计算出类型的对齐方式,alignas
可以指定结构体的对齐方式。
但是alignas
在某些情况下是不能使用的,具体见下面的例子:
alignas
将内存对齐调整为4个字节。所以sizeof(Info2)
的值变为了8。
若alignas
小于自然对齐的最小单位,则被忽略。
- 如果想使用单字节对齐的方式,使用
alignas
是无效的。应该使用#pragma pack(push,1)
或者使用__attribute__((packed))
。
确定结构体中每个元素大小可以通过下面这种方法:
这种处理方式是alignas
处理不了的。
评论(2)
帅地哥,本篇存在错误,S2和S3应该都是占24字节大小
重新找了个更加详细的答案