所以当我使用属性((aligned(x))指令时,我看到了一个有趣的编译器行为。(我正在使用GCC)
考虑以下结构
typedef struct
{
char buffer[4096] __attribute__((aligned(4096));
int y;
} s1;
结构大小为4100字节,必须是4K对齐的地址, 在查看生成的.map文件时,我看到结构确实与4k地址对齐,但还有2个不需要的副作用:
在我的对齐结构之前的变量之间有一个填充 - 因为它浪费空间我怎样才能让编译器尝试用其他变量填充这个空间?
不仅结构地址对齐,它也变得大小对齐,即它开始后的变量也在与4K对齐的偏移处(即为4100字节结构分配8K),详见下文。
我的问题:我如何让编译器尝试优化填充并在那里放置变量(例如跟随它的变量)以及如何阻止编译器将结构大小与其对齐地址?
0x00012524 variable1
0x00012534 [padding]
0x00013000 my_struct (0x4100 bytes but consumes 8192)
0x00015000 variable3
由于 维托
答案 0 :(得分:0)
除了在链接描述文件中声明一个额外的段并将变量放在那里之外,我没有看到任何其他方法。将此段放在.bss和.data段之后,您就完成了:)