所以我在使用attribute((aligned(x((指令时看到了一个有趣的编译器行为。(我正在使用海湾合作委员会(
考虑以下结构
typedef struct
{
char buffer[4096] __attribute__((aligned(4096));
int y;
} s1;
结构大小为 4100 字节,必须采用 4K 对齐的地址, 查看生成的 .map 文件时,我看到结构确实与 4K 地址对齐,但还有 2 个不需要的副作用:
位于我对齐结构之前的变量之间有一个填充 - 因为它浪费空间,我如何让编译器尝试用其他变量填充这个空间?
不仅结构地址对齐,而且大小对齐,即变量开始后也偏移量对齐 4K(即 8K 分配给 4100 字节结构(,更多详细信息见下文。
我的问题:如何使编译器尝试优化填充并在那里放置变量(例如,它后面的变量(,以及如何防止编译器将结构大小与其对齐的地址对齐?
0x00012524 variable1
0x00012534 [padding]
0x00013000 my_struct (0x4100 bytes but consumes 8192)
0x00015000 variable3
谢谢 维托
除了在您的链接器脚本中声明一个额外的段并将变量放置在那里之外,我没有看到任何其他方法。将此段放在 .bss 和 .data 段之后,您就完成了:)