C中的结构填充

时间:2011-06-19 05:18:54

标签: c structure

如果我在以下的C中有结构定义

typedef struct example 
{
  char c;
  int ii;
  int iii;
};

当我声明上述结构类型的变量时,应分配的内存是多少。 例如ee;

还有什么是结构填充以及是否存在与结构填充相关的风险?

2 个答案:

答案 0 :(得分:10)

试试吧。在不同的系统上可能会有所不同。

#include <stdio.h>
#include <stddef.h> /* for offsetof */
struct example { char c; int ii; int iii; };
int main(int argc, char *argv[])
{
    printf("offsetof(struct example, c) == %zd\n", offsetof(struct example, c));
    printf("offsetof(struct example, ii) == %zd\n", offsetof(struct example, ii));
    printf("offsetof(struct example, iii) == %zd\n", offsetof(struct example, iii));
    return 0;
}

输出:

offsetof(struct example, c) == 0
offsetof(struct example, ii) == 4
offsetof(struct example, iii) == 8

请注意sizeof(char) == 1,但ii字段前有四个字节。额外的三个字节是填充。存在填充以确保数据类型排列在处理器的正确边界上。

如果处理器进行未对齐访问,可能会发生各种各样的事情:

  • 访问速度较慢(大多数是x86)
  • 访问必须由内核处理并且难以置信(各种PowerPC)(这导致一些计算机游戏在快速PPC 603处理器上运行速度非常慢,因为它们在较慢的PPC 601处理器上运行得很好。)
  • 程序崩溃(各种SPARC)

我知道填充没有已知的风险。真正发生的唯一问题是用不同编译器编译的两个程序(已知GCC与MSVC导致这种情况)使用不同的填充并且不能共享结​​构。如果来自不同编译器的代码链接在一起,这也可能导致崩溃。由于填充通常由平台ABI指定,因此很少见。

答案 1 :(得分:0)

在正常的32位下,它应该占用12个字节 - c字段将被填充。然而,这是架构和编译器所依赖的。

您始终可以使用pragma为编译器声明结构的对齐方式(对于某些编译器,更改默认对齐方式)。