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

相关推荐
益莱储中国3 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php
丰色木夕4 小时前
Ubuntu22.04下源码编译安装USD-Brep
c++·ubuntu·nvidia·usd-brep
benchmark_cc4 小时前
Python 量化系统如何设计统一的数据访问接口:从策略解耦到数据层架构
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
const_qiu4 小时前
第四章 00:开篇 —— 从「会聊天」到「记得住、会干活、能协作」
java·开发语言·人工智能·python
Wang's Blog4 小时前
Java 项目实战: 交友项目 - 个人资料管理的更新接口实现与坑
java·开发语言·交友
CoderYanger4 小时前
Java EE 进阶:4.Spring Web MVC 入门(第一弹)
java·开发语言·前端·spring·面试·java-ee·mvc
估值探索者5 小时前
【Python量化选股流水线 #04】选股器好不好用?「昨日候选→今日表现」回看验收
开发语言·python·股票数据·股票数据api接口
爱喝热水的呀哈喽6 小时前
HEJIAN RESEARCH
开发语言·matlab
白露与泡影6 小时前
后端 Java 面试核心八股汇总|高频面试题 + 解析,覆盖基础到进阶
java·开发语言·面试
xifangge20256 小时前
基于 JavaScript 实现 CNC 数控切削参数与螺纹公差纯前端核算引擎
开发语言·前端·javascript