为什么包含单个字符的struct在32位系统上没有填充到4号?

时间:2015-05-12 14:37:40

标签: c struct padding sizeof

struct test {
    char c;
} x;

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

2 个答案:

答案 0 :(得分:0)

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

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/

答案 1 :(得分:-1)

在C中,strucute填充到当前数据大小。 如果你有一个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个字节的填充,以便进行内存访问优化。