我能够使用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