获取类成员变量的大小(不运行代码)

时间:2014-09-19 21:43:24

标签: c++ static-analysis disassembly objdump

有没有办法在不实际运行代码的情况下获取特定类的所有成员变量的大小? (即没有sizeof(),offset_of()操作)

objdump或otool有一些选项可以从中间对象文件(甚至是最终的ELF文件)中提取这些信息吗?

编辑:

“我想做什么?”:

我注意到在我们软件的两个版本之间,一个特定的类实例在大小上膨胀。这个类非常庞大,有很多很多成员变量。有问题的类在两个构建之间没有变化,但它的成员变量确实如此。我正试图找到罪魁祸首(这将是一个深度优先搜索,因为我将不得不继续深入挖掘每个成员变量,直到我找到它)并需要一个可扩展的方法来做这不依赖于printfs()和diffing。

2 个答案:

答案 0 :(得分:2)

您可以打印编译时常数,例如sizeof没有运行代码。例如:

class X
{
  int x;
  int y;
  int z;
};


template <int i>
class foo;

foo<sizeof(X)> x;

错误消息清楚地说明了sizeof表达式的值:

test.cpp:12:16: error: aggregate ‘foo<12> x’ has incomplete type and cannot be defined
 foo<sizeof(X)> x;

也适用于offsetof。您还可以一次查询更多偏移量:

#include <cstddef>
foo<offsetof(X,X::x)> offset_x;
foo<offsetof(X,X::y)> offset_y;
foo<offsetof(X,X::z)> offset_z;

结果:

test.cpp:15:23: error: aggregate ‘foo<0> offset_x’ has incomplete type and cannot be defined
 foo<offsetof(X,X::x)> offset_x;
                       ^
test.cpp:16:23: error: aggregate ‘foo<4> offset_y’ has incomplete type and cannot be defined
 foo<offsetof(X,X::y)> offset_y;
                       ^
test.cpp:17:23: error: aggregate ‘foo<8> offset_z’ has incomplete type and cannot be defined
 foo<offsetof(X,X::z)> offset_z;

答案 1 :(得分:1)

您可以创建基于Clang的工具来编译代码并在编译时转储类的记录布局。然后你就可以比较它们了。

(也许其他编译器也有类似的方法。)