结构对齐问题

时间:2012-07-17 18:41:07

标签: c memory-management embedded embedded-linux

我的编译器要求我有一个内存对齐的结构声明,以确保正确的数据访问。 我有一个顶部结构,由一些其他结构组成。是否足以确保顶部结构与32字节边界对齐,或者我需要确保每个结构应与32字节边界对齐。 代码段如下: -

typedef struct {
   int p;
   int q;
   char n;
} L;

typedef struct {
   int c;
   int d;
   char e;
   L    X2[13];
} B;

typedef struct {
   int a;
   int b;
   B   X1[10];
} M;

为确保正确的数据访问,我是否需要确保所有结构都正确对齐内存,或者填充最顶层的结构将确保内存对齐。

3 个答案:

答案 0 :(得分:2)

有时你的应用程序可能需要特定的布局,但如果你说在这种情况下它是你的编译器的要求(或者更准确地说是你的编译器的目标架构),那么它就是编制者有责任确保满足这些要求。

如果您需要对齐编译器将根据目标要求自然执行的对齐,则需要编译器特定的指令用于打包和对齐;然而,应用这样的指令并使其出错更可能导致对齐错误,而不是让编译器处理它。如果您尝试通过添加自己的填充成员来对齐,它可能有效,但是没有必要,编译器也可以插入自己的填充。

关键是编译器不会生成具有无法安全有效地解决的成员的结构。它将在成员之间插入任何必要的填充,以确保后续成员是可寻址的。

如果您认为它不起作用,请让您的链接器输出一个映射文件(如果它还没有这样做)并检查这些符号的地址以验证正确的对齐方式。还要看一下生成的结构大小;你可能会发现它们中的一些大于它们各部分的总和 - 这就是编译器通过插入填充来强制对齐。

答案 1 :(得分:0)

如果您可以使用它,如果您的应用程序(或体系结构或性能)需要它,C11会有对齐语句:http://en.wikipedia.org/wiki/C11_%28C_standard_revision%29

  • 对齐规范(_Alignas说明符,alignof运算符,aligned_alloc函数,头文件)

GCC肯定也有扩展。

答案 2 :(得分:0)

如果你想使用自然对齐,你必须订购 字段和手动填充到自然字大小。可移植性 不保证,但对于特定的处理器,这可以做到 (在嵌入式世界中并不罕见)。如果sizeof(int)是4 您必须在子结构中添加填充以确保对齐 在数组中(我假设你的目标是避免“秘密”填充 由编译器添加?)。例如:

typedef struct {
   int p;
   int q;
   char n;
   char pad[3];
} L;

typedef struct {
   int c;
   int d;
   char e;
   char pad[3];
   L    X2[13];
} B;

typedef struct {
   int a;
   int b;
   B   X1[10];
} M;

通常会导致结构中没有“隐藏”对齐。