【问题标题】:Getting sizes of class member variables (without running code)获取类成员变量的大小(无需运行代码)
【发布时间】:2014-09-19 21:43:23
【问题描述】:

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

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

编辑:

“我想做什么?”:

我注意到在我们的软件的两个版本之间,一个特定的类实例的大小膨胀了。这个类非常大,有很多很多的成员变量。有问题的类在两次构建之间没有变化,但它的成员变量却发生了变化。我试图找到罪魁祸首(这将是一种深度优先搜索,因为我必须继续深入挖掘每个成员变量,直到找到它)并且需要一种可扩展的方法来做这没有诉诸 printfs() 和差异。

【问题讨论】:

  • "没有运行代码" - 阅读编译器手册?
  • 你可以在编译时使用sizeof,所以不用printf

标签: c++ static-analysis disassembly objdump


【解决方案1】:

您可以打印编译时常量,例如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;

【讨论】:

【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-31
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    相关资源
    最近更新 更多