32位与64位下C++结构体对齐填充问题咨询
结构体成员偏移量问题解答
先看给定的C++结构体声明:
struct SFoo { int A = 200; }; struct SBar { SFoo Foo = SFoo(); SBar* Bar = this; };
1. 64位编译环境下offsetof(SBar, Bar) == 8的原因
- 64位系统中,指针类型的大小为8字节,用于存储64位内存地址。
- C++结构体遵循内存对齐规则:每个成员的起始地址必须是自身类型大小的整数倍,以此保证CPU内存访问的效率。
SFoo的大小是4字节,但后续的SBar*类型大小为8字节,为了满足对齐要求,编译器会在Foo成员后插入4字节的填充空间。此时Bar的起始位置从第8字节开始,因此偏移量等于8。
2. 32位编译环境下偏移量为4的原因
- 32位系统中,指针类型的大小为4字节,和
SFoo的大小完全一致。 Foo成员(4字节)的末尾地址刚好是4的整数倍,完全满足SBar*的对齐要求,不需要额外填充空间。因此Bar直接紧跟在Foo之后,偏移量就是4。
内容的提问来源于stack exchange,提问作者SuperEwald
相关产品推荐
相关产品推荐

