有没有办法知道编译后的可执行文件中的变量或对象使用了多少指令或资源?
例如,我想知道空std::vector<int>
将在编译的二进制文件中使用多少空间。
答案 0 :(得分:0)
告诉编译器生成程序集列表(编译器/链接器选项,取决于您的编译器和平台)。然后用一次编译它,一次没有变量或对象。比较两个生成的列表中的行数。这应该会给你指令的不同。
编辑:由于各种优化,对齐,代码重新排序,测量可能不是100%准确。正如@Klaus指出的那样,当超出内联阈值并从更多来源产生较小的列表时,可能会看到悖论结果。
编辑:特别是与C ++模板有关,另请参阅Can we see the template instantiated code by C++ compiler
(你提到“在已编译的可执行文件中”,所以我假设你在询问编译时,而不是运行时)。
答案 1 :(得分:-1)
“C ++模板完整指南”一书的作者(6.6.4章)建议使用所谓的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;
}