2009-07-15 69 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);