我的编译器要求我有一个内存对齐的结构声明,以确保正确的数据访问。 我有一个顶部结构,由一些其他结构组成。是否足以确保顶部结构与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;
为确保正确的数据访问,我是否需要确保所有结构都正确对齐内存,或者填充最顶层的结构将确保内存对齐。
答案 0 :(得分:2)
有时你的应用程序可能需要特定的布局,但如果你说在这种情况下它是你的编译器的要求(或者更准确地说是你的编译器的目标架构),那么它就是编制者有责任确保满足这些要求。
如果您需要对齐编译器将根据目标要求自然执行的对齐,则需要编译器特定的指令用于打包和对齐;然而,应用这样的指令并使其出错更可能导致对齐错误,而不是让编译器处理它。如果您尝试通过添加自己的填充成员来对齐,它可能有效,但是没有必要,编译器也可以插入自己的填充。
关键是编译器不会生成具有无法安全有效地解决的成员的结构。它将在成员之间插入任何必要的填充,以确保后续成员是可寻址的。
如果您认为它不起作用,请让您的链接器输出一个映射文件(如果它还没有这样做)并检查这些符号的地址以验证正确的对齐方式。还要看一下生成的结构大小;你可能会发现它们中的一些大于它们各部分的总和 - 这就是编译器通过插入填充来强制对齐。
答案 1 :(得分:0)
如果您可以使用它,如果您的应用程序(或体系结构或性能)需要它,C11会有对齐语句:http://en.wikipedia.org/wiki/C11_%28C_standard_revision%29
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;
通常会导致结构中没有“隐藏”对齐。