2013-02-05 143 views
2

如果我有這樣的結構:結構填充陣列

struct { 
     int a; 
     int b; 
     int values[20]; 
     } 

它會有什麼樣的填充?

我已經搜索過關於此事的信息,但是我發現的所有信息都是在不同數據類型之間填充的。

+0

它可能不會,如果我們假設'int'有一個字大小。最好的方法是確定一個'sizeof'。 – imreal

回答

1

它會有任何種類的填充?

我認爲填充是實現定義的東西。然而,一個合理的解釋是,它不會,因爲所有的成員必須對齊相同的字節數。實際上,這是在我的Mac(OS 10.7.5)真與GCC:

enter image description here

(該結構的大小爲88個字節:4 + 4 + 20×4,所以沒有填充。 )

1

我認爲唯一的填充標準將允許在該情況是填充,這是共同所有int變量。雖然這是典型的int利用存在於它覆蓋在內存unsigned char位置上的所有位的,它不是必需的。一些數字信號處理器的累加器具有36位,40位或48位等非冪次長度的累加器(想法是人們經常想要將總和超過32位的一串32位數加在一起;需要大於32位的累加器,但是64位累加器將會大規模過度使用)。具有16位存儲器總線的DSP可能能夠從存儲器中讀取和寫入值,但是對於其他任何情況都需要特定的對齊。如果這樣的DSP有40位累加器,這樣的設備可以存儲其int類型爲六個字節,其中之一將是未使用的(我認爲它更可能的是這樣的設備,就可以使用32位int類型和也許提供了一個40位short long或東西的情況下的int是不是很夠,但是40位int將是「合法」)。

一般而言,該標準要求沒有類型可能需要對準比其尺寸大,和任何類型的陣列,至少一個結構內,具有相同的對齊要求爲基礎類型(一些實施方式可以具有靜態分配數組的特殊對齊要求,例如要求任何小於頁面大小的數組都必須放置,以免跨越頁面邊界,除非使用#pragma或其他指令指示,否則標準爲對這樣的要求一目瞭然,因爲它們唯一可能的效果是減少程序可以聲明的變量的數量而不會耗盡內存)。