2017-08-16 114 views
0

所以我使用的属性((对齐(X))的指令时,看到了一个有趣的编译器的行为。(我使用GCC)副作用

考虑下面的结构

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

结构大小是4100个字节,看生成.MAP文件,我看到确实的结构对齐到4K地址,但与另外2不必要的副作用时,必须在4K对齐的地址, 效果:

  1. 在位于我的对齐结构之前的变量之间存在填充 - 因为它浪费了空间,我怎样才能让编译器尝试并用其他变量填充此空间?

  2. 不仅结构地址是对齐的,它也变成了大小对齐的形式,也就是说,它也在偏移量与4K对齐后开始变量(即8K被分配给4100字节结构),详见下文。

我的问题:如何使编译器尝试优化填充和地方变量存在(如变量,它后面)和如何防止编译器的结构尺寸对准其对齐的地址?

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

感谢 维托

+0

您告诉编译器对齐,然后您不想。 –

+0

对于尾部填充,您无法做任何事情,这是预期的对齐对象。你可能希望得到的最好的结果是'variable3'被放置在你的'struct'之前......也许一个优化大小的选项(比如'-Os')会有所帮助。 –

+0

1)与对齐的扩展无关 - 结构必须在偶数地址分配,就这么简单。 – Lundin

回答

0

我没有看到任何其他的方式,但在你的链接脚本声明一个附加段和变量出现的地方。将此段放在.bss和.data段之后,然后完成:)