【问题标题】:Why is struct containing single char not padded to size 4 on a 32-bit system? [duplicate]为什么在 32 位系统上包含单个字符的结构未填充到 4 大小? [复制]
【发布时间】:2015-07-23 12:24:52
【问题描述】:
struct test {
    char c;
} x;

根据我对结构填充的了解,我预计此结构的大小在 32 位系统上为 4 字节。为什么显示1个字节?

【问题讨论】:

标签: c struct padding sizeof


【解决方案1】:

你只有一个字符,在这种情况下你不需要任何对齐/填充。 如果你尝试这个,你应该会看到一些对齐:

char *p;      /* 4 or 8 bytes */
char c;       /* 1 byte */
//char pad[3];  /* 3 bytes */
int x;        /* 4 bytes */

对于不同的架构有不同的规则,在这种情况下,int 有一个 4 字节对齐,这会强制添加三个字节的填充。

来源: http://www.catb.org/esr/structure-packing/

【讨论】:

    【解决方案2】:

    在 C 中,结构被填充到当前数据大小。 如果你有一个 char 将对齐到 1B,短到 2B 等等。

    一个快速的规则是:先前元素的大小 + 当前元素的大小与当前元素的大小对齐。

    这里有一些例子:

    struct
    {
        int  a1; // 0 + 4 aligned to 4 => 4
        char a2; // 4 + 1 aligned to 1 => 5
    } // total size 5
    
    struct 
    {
        char a1; // 0 + 1 aligned to 1 => 1
        int a2; // 1 + 4 aligned to 4 => 8
    }
    
    struct
    {
        char a1; // 0 + 1 aligned to 1 => 1
        short a2; // 1 + 2 aligned to 2 => 4
        int a3; // 4 + 4 aligned to 4 => 8
    }
    

    这条规则是内存寻址的影响: 读取/写入 X 字节内存的最快方法是该内存地址是 X 的倍数。(这就是英特尔处理器通过忽略某些寻址位来优化内存访问的方式)。

    另一个填充是内存中的结构之间。如果您的结构具有 intchar(总大小为 5),则在内存中,它们之间仍将有 3 个字节填充以优化内存访问。

    【讨论】:

      猜你喜欢
      • 2018-12-24
      • 2021-08-22
      • 2019-04-27
      • 1970-01-01
      • 2013-07-24
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 2011-11-22
      相关资源
      最近更新 更多