2012-08-29 110 views
4

如何知道實際結構尺寸? 使用sizeof返回對齊後的字節數。 例如:實際結構尺寸

struct s { 
       char c; 
       int i 
} 

sizeof(s)= 8; 我有興趣獲得沒有對齊的字節大小,即5

+7

出於好奇,你爲什麼需要這個? – hansmaad

+0

可能會關閉對齊(VS中的編譯指示包(1)),然後計算sizeof(s) – marcinj

+2

我同意Kiril的觀點,因爲它的問題不清楚,也不知道OP試圖實現什麼,很可能會脫離目標。我們需要拭目以待... –

回答

3

的sizeof返回實際的結構尺寸。

沒有填充的大小有點沒有意義,因爲編譯器會插入感覺合適的填充。一些編譯器支持關閉結構填充的編譯指示,在這種情況下,您應該使用它,但您可能會發生各種有趣的事情。

8

結構的實際大小是對齊後結構的大小。我的意思是sizeof返回內存中結構的大小。如果你想有一個按字節對齊的結構,你應該告訴編譯器這樣做。例如這樣的事情:

#ifdef _MSVC 
# pragma pack(push) 
# pragma pack(1) 
# define PACKED 
#else 
# define PACKED   __attribute((packed)) 
#endif 
struct byte_aligned { 
    char c; 
    int i; 
} PACKED; 
#ifdef _MSVC 
# pragma pack(pop) 
#endif 

現在sizeof(byte_aligned)回5及其在記憶裏卻5字節

+0

同樣的事情,我已經提到:這實際上會包裝結構,我們不能確定,OP想要這個。他/她可能只想檢索「真實」的大小,沒有任何填充,沒有包裝。 –

+0

真正的大小是'sizeof'返回的大小,我的意思是'sizeof'返回一個我可以使用的大小:'pStruct = new an_struct [2]; char * p =(char *)pStruct; p + = sizeof(an_struct); ((an_struct *)p) - > i = 0;'它應該總是有效的,所以'sizeof'返回實際大小,你的意思是預期的大小,我認爲我的結構的大小,但實際大小是填充後的大小 – BigBoss

+0

這就是爲什麼我把'real'放在引號中:)而且我提到_'沒有任何填充,沒有打包'_。我知道'sizeof'的作用和它給出的尺寸。 –

0

您誤解了文檔。

使用的sizeof對準

這是不正確之後返回的字節數。 sizeof返回填充後的字節數,這不是一回事。

因此,如果你想知道的是「我的結構需要多少空間」,sizeof()告訴你正確的答案。