2013-07-15 22 views
1

我對沒有參數的結構對齊屬性有一些疑問。當聲明一個像下面給出的對齊結構時。在16位目標上沒有參數和對齊的結構對齊

struct __attribute__ ((aligned)) 
{ 
    char a; 
}s; 
printf("%zu\n",sizeof(s)); 

輸出根據下面的鏈接爲16
http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Type-Attributes.html

編譯器會自動將該類型的對齊方式設置爲您正在編譯的目標機器上的任何數據類型所使用的最大對齊方式。

這意味着我不能聲明大於16字節的對齊方式。但是,如果我給

struct __attribute__ ((aligned(32))) 
{ 
    char a; 
}s; 
printf("%zu\n",sizeof(s)); 

然後我得到的輸出32
這意味着我們可以宣佈大於16字節對齊。
那麼爲什麼要獲得16個字節?它是編譯器特定還是目標特定?

在16位系統上的對齊 - 我讀了16位系統上不會有任何對齊問題。誰能告訴我爲什麼?

+2

我想你誤解了「數據類型」。自動對齊是針對該體系結構原生的最大整數,浮點或指針大小。你顯然可以在更大的邊界上對齊,但它不會讓你獲得性能。 – Kevin

回答

1

如果編譯器獲得一個不合格的__attribute__((aligned))屬性,它將默認爲以達到機器上最大的必要對齊。這與說'你不能設置更大的路線'不一樣;您的測試表明您可以明確設置更大的對齊方式。除非您明確表示,否則您不會獲得更大(或更小)的對齊。

+0

謝謝,我明白,關於對齊。但關於16位系統的對齊。是否存在對齊問題?,如果它的指針保持地址不是2的順序。 –

+0

如果您問「在16位機器上,是否會有問題從一個地址讀取16位數據2的倍數?「,那麼答案取決於硬件。對於一些芯片(比如英特爾)來說,速度會有所下降,但也不例外;對於其他芯片(例如M68k,如果您仍然可以找到它們),則會出現總線錯誤。 –

+0

這是否意味着在16位系統中對齊會有問題?,如果指針保持地址不是2的電源導向。 –