使用__attribute __((aligned(X))

时间:2017-08-16 13:58:26

标签: c gcc memory-alignment

所以当我使用属性((aligned(x))指令时,我看到了一个有趣的编译器行为。(我正在使用GCC)

考虑以下结构

typedef struct 
{
  char buffer[4096] __attribute__((aligned(4096));
  int y;
} s1;

结构大小为4100字节,必须是4K对齐的地址, 在查看生成的.map文件时,我看到结构确实与4k地址对齐,但还有2个不需要的副作用:

  1. 在我的对齐结构之前的变量之间有一个填充 - 因为它浪费空间我怎样才能让编译器尝试用其他变量填充这个空间?

  2. 不仅结构地址对齐,它也变得大小对齐,即它开始后的变量也在与4K对齐的偏移处(即为4100字节结构分配8K),详见下文。

  3. 我的问题:我如何让编译器尝试优化填充并在那里放置变量(例如跟随它的变量)以及如何阻止编译器将结构大小与其对齐地址?

    0x00012524      variable1 
    0x00012534      [padding]
    0x00013000      my_struct (0x4100 bytes but consumes 8192)
    0x00015000      variable3 
    

    由于 维托

1 个答案:

答案 0 :(得分:0)

除了在链接描述文件中声明一个额外的段并将变量放在那里之外,我没有看到任何其他方法。将此段放在.bss和.data段之后,您就完成了:)