2017-08-16 58 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段之後,然後完成:)