c++ - 为什么要为结构的多个数据成员而不是单个成员添加填充?

标签 c++ c linux operating-system

为什么只在结构体有多个成员时才加入填充的概念,而在只有一个基本数据类型成员时不加入填充的概念?

如果我们考虑在 32 位机器上

struct 
{
    char a;
} Y;

没有填充并且 sizeof Y 达到 1 字节。

如果我们考虑这个结构

struct 
{
    char a;
    int b;
} X;

X 的大小将为 8 个字节。

我的问题是 为什么在第二种情况下添加填充?如果是为了让通常以 4 字节的倍数 block 读取数据的机器进行高效访问,那么为什么在第一种情况下没有填充?

最佳答案

在第二种情况下添加了填充,因为在您的机器上,int 对齐到 4 个字节。因此它必须位于可被 4 整除的地址。

0x04   0x05   0x06   0x07   0x08   0x09   0x0A   0x0B

  a      b      b      b      b     

如果不添加填充,则int 成员从地址0x05 开始,这是错误的。添加了 3 个填充字节:

0x04   0x05   0x06   0x07   0x08   0x09   0x0A   0x0B

  a   |      padding      |   b      b      b      b

现在 int 位于 0x08,没问题。

关于c++ - 为什么要为结构的多个数据成员而不是单个成员添加填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12861582/

相关文章:

linux - 未找到体系结构 x86_64、macOS Sierra

c++ - 字节大小(说明)

c++ - 具有模板化返回值解决方法的虚拟模板函数

c++ - 在 OSX 上相当于 Windows 的 QueryPerformanceCounter 是什么?

c - 使用linux内核加密子系统的arc4算法

c - 两个二进制数字串相加 - C

c - 如何按接口(interface)过滤多播接收套接字?

c++ - 在对象的析构函数被调用后使用对象

c - 监听两个不同套接字接口(interface)的服务器程序

c++ - 如何在一台 Ubuntu 机器上安装 2 个 Opencv 版本以及如何一次激活一个版本进行编译?