2011-10-03 30 views
2

說我有一個大的結構,其中包括其他結構等。gcc -os或任何其他gcc優化開關改變它存儲在內存中的方式?即它會包裝結構以擠出一些額外的空間嗎?gcc優化對結構大小的影響

感謝,

+3

你試過了嗎?我敢打賭,你沒有 – BlackBear

回答

3

不,爲了更改gcc中的結構的本地平臺對齊,您必須明確使用__attribute__((packed))__attribute__((align X))編譯器指令或其他gcc命令行開關,這些命令行開關專門指示編譯器更改數據相關的本機平臺對齊方式,結構。

此外,包裝具有混合數據類型的結構,使得所有的數據成員可能無法在存儲器中的適當的字邊界上對齊實際上將是在運行時訪問一個數據成員慢,不是更快。這是因爲在訪問數據成員之前,編譯器必須將結構解壓縮回平臺的本地對齊。

+2

這不是唯一的方法 - 也有命令行開關,例如'-malign = ...',你可能會在'-m32'和'-m64'。 –

+0

好的,更新...謝謝。 – Jason

+0

我比'__attribute__'東西更喜歡'#pragma pack'。主要是因爲我從來不喜歡屬性語法,但部分原因是因爲編譯器支持它的編譯指示包語法非常相似。 –

3

不,這是不應該的 - 只要你有你的所有代碼模塊相同的對齊方式和包裝選項,就應該正常工作在一起,即使編譯不同的優化級別,

+0

如果你有不同的佈局由不同的'-O'設置產生,例如,當一個翻譯單元生成的代碼可能與另一個翻譯單元在發佈結構/類時發佈的佈局和發佈的聲明在另一個文件中使用。這將是一場噩夢,所以你會明白爲什麼這不是一種選擇,正如前一張海報指出的那樣。 –

0

事實上,我可以看到如何對準結構(通過填充它們)可能導致更短的代碼(沒有跨境字尋址 - >更少的加載/存儲)

-Os優化二進制大小(即通常被稱爲代碼大小)不是內存壓縮