2016-12-06 53 views
2

下面的代碼:如何讓gcc在生成.data段時忽略填充?

#include <stdint.h> 

uint8_t byte = 0x12; 
uint16_t word = 0x1234; 

int main(int argc, char *argv[]) 
{ 

     return 0; 
} 

檢查的.data部分,它表明byte可變2個字節,而不是1,uint8_t承諾:

Hex dump of section '.data': 
    0x00601020 00000000 00000000 00000000 00000000 ................ 
    0x00601030 12003412       ..4. 

我們如何才能確保byte爲1個字節,甚至它會使內存錯位?我嘗試加入#pragam pack(1),但它仍然是一樣的。

+0

是否有你想要的特定原因? –

+0

爲什麼你會想禁用[堆棧對齊和填充](http://stackoverflow.com/questions/1061818/stack-allocation-padding-and-alignment)? –

+0

因爲我想知道'byte'變量是否被用作2個字節,而不是1個字節。但是,似乎,當我嘗試設置'byte = -1'時,只有一個字節變爲'ff'。看起來'gcc'確保填充字節不會在所有生成的代碼中使用。 –

回答

0

字節變量2個字節,而不是1,uint8_t承諾

變量爲1,但它的編譯器墊2個字節。請注意,這不會影響總節的大小(它仍然會對齊到2個字節)。

如何確保字節是1個字節,即使它使內存不對齊?

爲什麼要這麼做?在許多平臺上,這會導致編譯器爲內存訪問生成效率低下的代碼,所以由於代碼大小的增加,您將失去從變量對齊中擠壓的任何內容。如果您絕對必須使用未對齊的全局變量,請使用__attribute__((aligned(1)))來標記它們。