问候,
使用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 的大小(以字节为单位)?
答案 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)
始终找到(并且经常需要)结构的总大小。因此,字段的大小正如您所期望的那样,并且填充不计入单个字段,即使它确实增加了结构的整体大小。