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

相关推荐
basketball6161 分钟前
Golang:基础语法总结
开发语言·后端·golang
兰令水2 分钟前
leecodecode【双指针题2】【2026.5.26打卡-java版本】
java·开发语言·算法
不吃土豆的马铃薯2 分钟前
TCP 三次握手 / 四次挥手详解
服务器·开发语言·网络·c++·网络协议·tcp/ip
羑悻的小杀马特3 分钟前
【动态规划篇】正则表达式与通配符:开启代码匹配的赛博奇幻之旅
c++·算法·leetcode·正则表达式
ch.ju4 分钟前
Java程序设计(第3版)第四章——引用
java·开发语言
Huangjin007_7 分钟前
【C++ STL篇(十三)】无序关联容器 unordered_set / unordered_map解析
开发语言·c++
白日与明月8 分钟前
pip下载库指定操作系统及python版本
开发语言·python·pip
折哥的程序人生 · 物流技术专研8 分钟前
Qoder 1.0 完全指南:从安装到Agents驱动开发实战
开发语言·人工智能·python·ai编程
Xin_ye1008610 分钟前
C# 零基础到精通教程 - 第十六章:ASP.NET Core Web API——构建现代 Web 服务
开发语言·c#
basketball61610 分钟前
Go语言介绍
开发语言·go