3

我正在使用 Linux 32 位操作系统和 GCC 编译器。

我尝试了三种不同类型的结构。在第一个结构中,我只定义了一个char变量。这个结构的大小是1,这是正确的。

在第二个结构中,我只定义了一个int变量。这里结构的大小显示为 4 也是正确的。

但是在第三个结构中,当我定义一char和一时int,这意味着总大小应该是 5,但输出显示为 8。谁能解释一下结构是如何分配的?

typedef struct struct_size_tag
{
    char c;
    //int i;
}struct_size;

int main()
{
        printf("Size of structure:%d\n",sizeof(struct_size));
        return 0;
}

输出:结构尺寸:1

typedef struct struct_size_tag
{
    //char c;
    int i;
}struct_size;

int main()
{
        printf("Size of structure:%d\n",sizeof(struct_size));
        return 0;
}

输出:结构尺寸:4

typedef struct struct_size_tag
{
    char c;
    int i;
}struct_size;

int main()
{
        printf("Size of structure:%d\n",sizeof(struct_size));
        return 0;
}

输出:

结构尺寸:8

4

4 回答 4

3

大小的差异是由于对齐。编译器可以自由选择填充字节,这使得结构的总大小不一定是其各个元素的总和。

如果结构的填充是不希望的,因为它可能必须与某些硬件要求(或其他原因)接口,编译器通常支持包装结构,因此填充被禁用。

于 2013-12-09T10:54:01.777 回答
2

你肯定会得到数据结构对齐

“数据对齐意味着将数据放置在等于字大小的某个倍数的内存偏移处,由于 CPU 处理内存的方式,这会提高系统的性能。为了对齐数据,可能需要在数据之间插入一些无意义的字节最后一个数据结构的结尾和下一个数据结构的开始,即数据结构填充。”

更多,看看这个,数据结构对齐

于 2013-12-09T10:54:39.327 回答
2

C 标准允许编译器在任何字段之后向结构添加填充字节,以允许根据编译器(或编译器用户)的任何特定要求对齐以下字段。标准没有指定,但通常编译器会提供命令行参数来指定(默认)对齐方式。好的编译器也总是支持 #pragma pack 的事实标准,包括推送和弹出选项。

填充字节通过减少适当对齐的数据类型所需的内存访问量来提高性能。例如,在 32 位处理器(更具体地说,是使用具有 32 条数据线的内存的系统)上,访问 32 位整数在读取和写入值时需要两次内存访问,而不是跨越 4 字节时只需一次边界(即,除非整数地址的低两位为零)。

有关更多详细信息,请参阅我的博客文章(比 Wikipedia 文章更好)。

于 2013-12-10T03:39:08.287 回答
1

神奇的词是填充/内存对齐@see data structure alignment

于 2013-12-09T10:54:35.727 回答