2009-07-15 65 views
0

問候,獲取最後一個成員的最終字節數

我能夠使用offsetof()宏找到填充後的字段的字節大小。

喜歡的東西

 

struct a 
{ 
    char r ; 
    char s[ 255 ] ; 
} ; 

// the size in bytes of r after compiler padding is going to be 
int lenR = offsetof(a, s) - offsetof(a, r) ; 

但我怎麼能找到在最後一個字段一個struct的的字節大小?

回答

4

如何:

int lenS = sizeof(a) - offsetof(a, s); 
+0

確認,您以20秒打我給它。 – 2009-07-15 00:56:18

1

我相信你的結構的第一個元素的大小總是等於sizeof(char)而你的結構的第二個元素的大小將是sizeof(char[255])。編譯器決定插入的任何填充由編譯器決定,並且該內存不屬於您。換句話說,該內存不受應用程序的限制,任何使用它的嘗試都可能導致未定義的行爲。也就是說,您仍然可以始終使用sizeof(struct a)查找(並經常需要)結構的總大小。因此,字段的大小正是您所期望的那樣,並且填充不會計入各個字段,即使它確實增加了結構的整體大小。

3

填充不是某一特定領域的一部分,它的結構本身的一部分。如果我有一個像

一個struct
struct foo { 
    T1 v1; 
     // <--- some padding here (A) 
    T2 v2; 
     // <--- some padding here (B) 
    T3 v3; 
}; 

是對V1的填充部分? V2?是B v2的一部分? V3?如果你關心的是如何將結構保存到一個文件或類似的東西,大多數(所有?)編譯器都有一種機制來禁用結構填充,即使是在一個struct by struct的基礎上。要找出結構的最後一個成員的大小,在這種情況下爲s,請使用sizeof,例如,

struct a tmp; 
size_t size = sizeof(tmp.s); 

如果你不希望創建一個臨時的,你可以利用這一發生的sizeof在編譯時和運行時沒有做任何事情,做一些喜歡這樣的事實優勢:

namespace { 
    const a& dummy_func(); 
} 
size_t size = sizeof(dummy_func().s); 

虛擬函數不需要永遠實現。

另一種選擇是

struct a { 
    ... 
    typedef char s_type[255]; 
    s_type s; 
}; 
size_t size = sizeof(a::s_type);