C++获取编译代码中使用的代码部分的大小

C++ get the size of a part of code used into the compiled code

本文关键字:代码部 获取 编译 代码 C++      更新时间:2023-10-16

有没有办法知道编译的可执行文件中的变量或对象使用了多少指令或资源?

例如,我想知道一个空的std::vector<int>将在编译的二进制文件中使用多少空间。

告诉编译器生成一个程序集列表(编译器/链接器选项,取决于编译器和平台)。然后用编译一次,不用变量或对象编译一次。比较生成的两个列表中的行数。这应该会给你指令数的差异。

编辑:由于各种优化、对齐和代码重新排序,测量可能不是100%准确。正如@Klaus所指出的,当超过内联占用并从更多来源生成更小的列表时,可能会出现悖论结果。

EDIT:特别是与C++模板有关的,请参阅。我们能看到C++编译器实例化的模板代码吗

(您提到了"在编译的可执行文件内部",所以我认为您询问的是编译时,而不是运行时)。

《C++模板完整指南》一书(第6.6.4章)的作者建议将所谓的Tracer对象用于类似的目的。

这是报价:

"tracer是一个用户定义的类,可以用作要测试的模板的参数满足模板的要求,且不超过这些要求。然而,更重要的是,示踪剂应该生成对其调用的操作的跟踪。例如,这允许通过实验验证算法的效率以及操作序列。"

示踪剂对象的简单示例:

#include <iostream>
#include <vector>
class TracerObject
{
public:
    TracerObject()
    {
       ++n_created;
    }
    ~TracerObject()
    {
       ++n_destroyed;
    }
    static int created_count(void)
    {
       return n_created;
    }
    static int destroyed_count(void)
    {
       return n_destroyed;
    }
    private:
    static int n_created;
    static int n_destroyed;
};
int TracerObject::n_created = 0;
int TracerObject::n_destroyed = 0;
int main(void)
{
   {
       std::vector<TracerObject> vector(2, TracerObject());
   }
   std::cout << "Constructor calls: " << TracerObject::created_count() << std::endl;
std::cout << "Destructor calls: " << TracerObject::destroyed_count() <<    std::endl;
    int i;
    std::cin >> i;
    return 0;
}