You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:54:58