我正在尝试构建一个简单的链表,其中每个元素都将与某个圆形地址对齐。我尝试了以下代码(尽可能缩短为 SSCCE):
#include "stdio.h"
#define N 10
typedef struct __attribute__((aligned(0x100)) _element {
int val;
char padding[64];
struct _element *next;
} element;
int main() {
element* head = new element;
element* current = head;
for (int i = 0; i < N; ++i) {
current->val = i;
if (i == N - 1)
break;
current->next = new element;
current = current->next;
}
current->next = NULL;
current = head;
printf("sizeof(element) = 0x%x\n", (unsigned int)sizeof(element));
while (current) {
printf("*(%p) = %d\n", ¤t->val, current->val);
current = current->next;
}
return 0;
}
使用 g++ 4.2.2 构建,没有优化,并产生:
sizeof(element) = 0x100
*(0x501010) = 0
*(0x501120) = 1
*(0x501230) = 2
*(0x501340) = 3
*(0x501450) = 4
*(0x501560) = 5
*(0x501670) = 6
*(0x501780) = 7
*(0x501890) = 8
*(0x5019a0) = 9
为什么地址不与 0x100 对齐?请注意,它确实影响了结构“大小”,看起来它以某种方式被填充,但它并没有像我想要的那样从对齐的地址开始。
从这个答案我了解到可能存在最大对齐,但即使将其降低到 0x20 也不会改变对齐(只有 sizeof)。 这个答案没有帮助,因为它是关于堆栈分配的。找不到任何其他来源来解释这一点。我对这个属性要求太多了吗?还是做错了什么?
提前致谢!