【问题标题】:How can i check if a template is compiled out?如何检查模板是否已编译?
【发布时间】:2011-06-04 14:44:54
【问题描述】:

有没有一种简单的方法可以检查我的模板是否已优化?使用#define HIDE_IT 后,运行代码如下。我确信这段代码已经过优化,所以我从定义Property<SomeType> 中得到了 0 开销,但我喜欢检查是否可能(无需进入汇编。在优化器通过后,琐碎的代码很难阅读)

template <class T>
class Property {
    T v;
    Property(Property&p) { }
public:
    Property() {}
    T operator=(T src) {
        v = src; return v; 
    }

    operator T() const { 
        return v;
    }
    T operator->() { return v; }
    T operator++() { return ++v; }
    template<class U>
    T operator+=(U u) { return v+=u; }
    T get() { return v; }
}

【问题讨论】:

  • 除非性能分析显示它是性能瓶颈,否则我什至不会担心。
  • @Anycorn:很好!我没有看到任何提及它!
  • 编译器可能会同时创建内联版本和轮廓版本,盯着库二进制文件也无济于事。通过汇编使用调试器会让您知道生成了哪些指令。
  • 你为什么在乎?如果编译器已经内联了所有的函数调用就好了。如果不是什么大不了的。编译器完成它的工作并生成它可以生成的最好的代码。您应该只担心您的工作(即编写尽可能合乎逻辑的可维护代码)。只要逻辑是等价的,就没有什么好担心的。
  • @Martin:实际上运行这个文件我的应用程序使用了大约 620mb 的内存,这是在优化了其中的一些内容之后。

标签: c++ templates optimization


【解决方案1】:

除了查看程序集之外别无他法。可以“优化”它的唯一方法是内联这些函数,您只能通过查看源代码来检查。

话虽如此,在任何现代编译器上,您都可以确定这些函数将内联到优化代码中。

【讨论】:

  • +1 表示“现代编译器,您可以非常确定这些函数将在优化代码中内联。” -1 表示组装错误。 Anycorn 在 linux 上使用 nm util 实现了这一目标
  • @Gene:我再次检查了 nm,结果发现我忽略了它。我的项目有几个具有属性的类。所以我创建了一个虚拟项目,它确实显示了属性符号。然而,它显示了两个具有相同地址(我猜它暗示它已被优化?)。 +1,但我暂时不接受
  • 我会注意到,如果没有 HIDE_IT,gcc 无论如何都会优化它,我使用 sizeof(thevar) 进行了检查。它显示为 4 而不是 8 哪个 vc 在调试模式下执行(如果 vars 较少,则使用 var 的函数也必须消失,这似乎是这种情况)
  • @acidzombie24:无论是否内联,都将为属性函数生成符号。查看这些符号并不能告诉您有关内联的任何信息。
猜你喜欢
  • 2011-05-09
  • 2015-08-24
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-04
相关资源
最近更新 更多