如何检查没有填充的struct的大小?

时间:2013-01-17 14:24:59

标签: c++ c gcc

让我们假设我有一个结构:

struct A {
  uint16_t a;
  uint64_t b;
};

有没有办法获得A w / o填充的大小?即:所有成员的sizeof总和(即使它不是递归的)。

通常sizeof(A) == 16. 我想要__GCC_sizeof__(A) == 10

我希望它在测试代码中不影响实际代码,这意味着结构定义中没有"#pragma""__attribute__"。 (尽管可以使用#ifdef TEST完成,但它非常难看。)

它不必是可移植的,GCC就足够了。

谢谢!

4 个答案:

答案 0 :(得分:5)

我认为sizeof(A::a) + sizeof(A::b)应该为你做的伎俩。没有办法获得一个未填充大小的结构,因为这样的大小可以为一个程序服务的目的是什么?

答案 1 :(得分:3)

  

目的是能够从测试中跟踪新添加的结构成员。

如果你先问这个问题会更好......

答案是肯定的,有方法,但不是#include文件;你应该使用能够获得AST / ABT结构的东西并列出字段,然后将它与预先注册的列表进行比较。例如,对于Clang来说,这是可能的。


但现在,让我们更进一步。你为什么要测试呢?它很脆弱!

最好测试功能,隐藏的内容是隐藏的。

如果每个功能都经过正确测试,那么只要测试通过,您是否知道字段列表就不重要了。

答案 2 :(得分:2)

我会看看这个Stackoverflow响应:

Is gcc's __attribute__((packed)) / #pragma pack unsafe?

并在此网站上获取海湾合作委员会的信息:

http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

如果在结构之前将pragma设置为1,它应该在字节边界上对齐并且是一个紧凑的大小,因此您可以使用sizeof来获取字节数。

如果只是少量结构,可以在声明结构之前启用pragma,然后再禁用它。

希望这对你的努力有所帮助。

答案 3 :(得分:0)

在C语言中,您可以使用预处理程序指令#pragma来检查sizeof结构而不填充..

#pragma pack(1)  

将为您提供sizeof结构而不填充..