我能夠使用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的的字節大小?
我能夠使用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的的字節大小?
如何:
int lenS = sizeof(a) - offsetof(a, s);
我相信你的結構的第一個元素的大小總是等於sizeof(char)
而你的結構的第二個元素的大小將是sizeof(char[255])
。編譯器決定插入的任何填充由編譯器決定,並且該內存不屬於您。換句話說,該內存不受應用程序的限制,任何使用它的嘗試都可能導致未定義的行爲。也就是說,您仍然可以始終使用sizeof(struct a)
查找(並經常需要)結構的總大小。因此,字段的大小正是您所期望的那樣,並且填充不會計入各個字段,即使它確實增加了結構的整體大小。
填充不是某一特定領域的一部分,它的結構本身的一部分。如果我有一個像
一個structstruct 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);
確認,您以20秒打我給它。 – 2009-07-15 00:56:18