0
所以我使用的屬性((對齊(X))的指令時,看到了一個有趣的編譯器的行爲。(我使用GCC)副作用
考慮下面的結構
typedef struct
{
char buffer[4096] __attribute__((aligned(4096));
int y;
} s1;
結構大小是4100個字節,看生成.MAP文件,我看到確實的結構對齊到4K地址,但與另外2不必要的副作用時,必須在4K對齊的地址, 效果:
在位於我的對齊結構之前的變量之間存在填充 - 因爲它浪費了空間,我怎樣才能讓編譯器嘗試並用其他變量填充此空間?
不僅結構地址是對齊的,它也變成了大小對齊的形式,也就是說,它也在偏移量與4K對齊後開始變量(即8K被分配給4100字節結構),詳見下文。
我的問題:如何使編譯器嘗試優化填充和地方變量存在(如變量,它後面)和如何防止編譯器的結構尺寸對準其對齊的地址?
0x00012524 variable1
0x00012534 [padding]
0x00013000 my_struct (0x4100 bytes but consumes 8192)
0x00015000 variable3
感謝 維託
您告訴編譯器對齊,然後您不想。 –
對於尾部填充,您無法做任何事情,這是預期的對齊對象。你可能希望得到的最好的結果是'variable3'被放置在你的'struct'之前......也許一個優化大小的選項(比如'-Os')會有所幫助。 –
1)與對齊的擴展無關 - 結構必須在偶數地址分配,就這麼簡單。 – Lundin