【发布时间】:2009-07-15 19:47:27
【问题描述】:
您好,
使用 offsetof() 宏填充后,我可以找到字段的字节大小。
类似
结构体 { 字符 r ; 字符 [255] ; } ; // 编译器填充后 r 的字节大小将是 int lenR = offsetof(a, s) - offsetof(a, r);但是我怎样才能找到结构的最后一个字段的字节大小呢?
【问题讨论】:
标签: c
您好,
使用 offsetof() 宏填充后,我可以找到字段的字节大小。
类似
结构体 { 字符 r ; 字符 [255] ; } ; // 编译器填充后 r 的字节大小将是 int lenR = offsetof(a, s) - offsetof(a, r);但是我怎样才能找到结构的最后一个字段的字节大小呢?
【问题讨论】:
标签: c
怎么样:
int lenS = sizeof(a) - offsetof(a, s);
【讨论】:
填充不是特定字段的一部分,它是结构本身的一部分。如果我有这样的结构
struct foo {
T1 v1;
// <--- some padding here (A)
T2 v2;
// <--- some padding here (B)
T3 v3;
};
A 是 v1 的填充部分吗? v2?。 B 是 v2 的一部分吗? v3?如果您担心填充会弄乱诸如将结构持久化到文件或类似的事情,大多数(全部?)编译器都有一种机制来禁用结构填充,即使是在逐个结构的基础上也是如此。要找出结构的最后一个成员的大小,在本例中为 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);
【讨论】:
我相信你的结构的第一个元素的大小总是等于sizeof(char),你的结构的第二个元素的大小将是sizeof(char[255])。编译器决定插入的任何填充都取决于编译器,并且该内存不属于您。换句话说,该内存是您的应用程序的禁区,任何使用它的尝试都可能导致未定义的行为。也就是说,您仍然可以使用sizeof(struct a) 找到(并且经常需要)结构的总大小。因此,字段的大小正是您所期望的,并且填充不计入各个字段,即使它确实增加了结构的整体大小。
【讨论】: