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

相关推荐
NiNi_suanfa1 天前
【Qt】Qt 批量修改同类对象
开发语言·c++·qt
小糖学代码1 天前
LLM系列:1.python入门:3.布尔型对象
linux·开发语言·python
Data_agent1 天前
1688获得1688店铺详情API,python请求示例
开发语言·爬虫·python
信奥胡老师1 天前
苹果电脑(mac系统)安装vscode与配置c++环境,并可以使用万能头文件全流程
c++·ide·vscode·macos·编辑器
妖灵翎幺1 天前
C++ 中的 :: 操作符详解(一切情况)
开发语言·c++·ide
Halo_tjn1 天前
虚拟机相关实验概述
java·开发语言·windows·计算机
star _chen1 天前
C++实现完美洗牌算法
开发语言·c++·算法
周杰伦fans1 天前
pycharm之gitignore设置
开发语言·python·pycharm
繁星星繁1 天前
【C++】脚手架学习笔记 gflags与 gtest
c++·笔记·学习
别叫我->学废了->lol在线等1 天前
演示 hasattr 和 ** 解包操作符
开发语言·前端·python