C++ 对象布局之padding(填充字节)

padding(填充字节)就是为了让成员按"对齐要求"放置,而在两个成员之间自动塞进去的"空白字节",程序不会用到这些字节的实际内容。

简单说几点:

  1. 每种类型有自己的对齐要求

    比如常见情况(具体跟平台/编译器有关):

    • char 对齐 1 字节

    • int 对齐 4 字节

    • double 对齐 8 字节

    意思是:这个成员的起始地址通常要是对应数字的倍数,比如 double 要从 8 的倍数的地址开始放。

  2. 编译器为满足对齐,在中间塞"空位"

    你的例子:

    复制代码
    struct A {
        int x;   // 4 字节,对齐 4
        char c;  // 1 字节,对齐 1
        double d;// 8 字节,对齐 8
    };

    在内存里大致是:

    • 先放 int x:占 4 字节

    • 再放 char c:占 1 字节

    • 接下来要放 double d,它要求地址是 8 的倍数

    • 此时偏移是 5(从 0 开始:0~3 是 x,4 是 c),5 不是 8 的倍数

    • 编译器就塞入 3 个字节的 padding,让下一个成员从偏移 8 开始

    • 然后从偏移 8 放 double d(8 字节)

    所以布局类似:

    复制代码
    [int x(4B)] [char c(1B)] [padding(3B)] [double d(8B)]
  3. 存在的目的

    • 满足 CPU 对内存对齐的要求

    • 提高访问效率(对齐访问通常比不对齐快,有的架构甚至不允许不对齐访问)

一句话总结:

padding 是编译器自动插入的"占位用垃圾字节",不存储你的有效数据,只是为了让后面的成员在"合适的地址"上开始,从而满足对齐和性能需求。

相关推荐
菜冻鱼1 分钟前
Python-pytorch-数据加载
开发语言·人工智能·pytorch·python·深度学习·机器学习
heimeiyingwang6 分钟前
【架构实战】可观测性三支柱实战:Metrics、Logging、Tracing 如何统一落地
开发语言·架构·php
caimouse27 分钟前
ReactOS 图形系统分析(53):系统库存对象 — stockobj.c
c语言·开发语言·spring
ZJU_统一阿萨姆1 小时前
【推理优化进阶】通信关键路径:NCCL、RDMA 与计算通信重叠
开发语言·人工智能·语言模型·架构·系统架构
我不是疯子是傻子1 小时前
Qt 程序打包部署全攻略:从 windeployqt 到 Inno Setup 的静默安装与版本迭代实战
开发语言·qt
城管不管2 小时前
重生——第十次面试之开源中国一面挂
java·linux·开发语言·算法·面试·职场和发展·开源
鸿芯微控科技2 小时前
MFC模拟量信号异常怎么排查?0-5V、4-20mA接线与量程换算
c++·5g·mfc·故障排查·质量流量控制器·4-20ma·模拟量信号
霸道流氓气质2 小时前
Java开发者AI编程常用MCP、Skills、Rules全景汇总
java·开发语言·ai编程
三十岁老牛再出发2 小时前
08.18每日总结
c++·python·numpy·pandas
zoujiahui_20183 小时前
Python 包与环境管理工具 uv
开发语言·python·uv