获取最后一个成员的最终字节数

时间:2009-07-15 00:49:10

标签: c

问候,

使用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 ) ;

但是如何找到结构的 last field 的大小(以字节为单位)?

3 个答案:

答案 0 :(得分:4)

怎么样:

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

答案 1 :(得分:3)

填充不是特定字段的一部分,它是结构本身的一部分。如果我有像

这样的结构
struct foo {
   T1 v1;
         // <--- some padding here (A)
   T2 v2;
         // <--- some padding here (B)
   T3 v3;
};

v1的 A 填充部分? V2? B 是v2的一部分吗? V3?如果你担心填充操作会将结构保存到文件或类似文件中,那么大多数(所有?)编译器都有一种机制来禁用结构填充,即使是逐个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);

虚拟func不需要实现。

另一种选择是

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

答案 2 :(得分:1)

我相信结构的第一个元素的大小总是等于sizeof(char),结构的第二个元素的大小将是sizeof(char[255])。编译器决定插入的任何填充都取决于编译器,并且该内存不属于您。换句话说,该内存对应用程序是不受限制的,任何使用它的尝试都可能导致未定义的行为。也就是说,您仍然可以使用sizeof(struct a)始终找到(并且经常需要)结构的总大小。因此,字段的大小正如您所期望的那样,并且填充不计入单个字段,即使它确实增加了结构的整体大小。