【发布时间】:2012-02-12 00:13:08
【问题描述】:
我用operator<< 定义了一个Debug 类(类似于Qt 中的qDebug)以将数据流式传输到stdout。
根据其模板参数(这又依赖于宏DEBUG),Debug 将被特化:一个特化的operator<< 将打印数据,而另一个特化将是安静的.
以下为静音版:
template< bool quiet = true >
class _Debug
{
public:
template< typename T >
_Debug& operator<<( const T & )
{
return *this;
}
};
然而,我注意到,即使是安静版本,operator<< 的参数也会被评估:
Debug<1>() << "Var " << var.name();
我可以通过分析器看到,在运行上述代码时,即使 Debug<1> 是 _Debug 的安静特化,也会评估表达式 "Var" 和 var.name()。
有什么办法可以避免这种情况吗?也许我应该将一些选项传递给 GCC?
我认为使用模板的类似解决方案会比使用宏的解决方案更简洁,性能更好,但可能是错误的......
【问题讨论】:
-
不要将你的东西命名为
_This,它是为实现保留的。 -
编译器如何知道 var.name() 正在做一些有效的事情或者是不需要编译的事情?
-
C++11?传递一个仅在调试模式下执行的 lambda 函数?虽然,我一直只是使用
DEBUG && cout << "Var";或类似的东西。 -
表达式是否被评估是否重要?如果最终的函数调用什么都不做,优化器应该注意这一点。然后只需申请专业化。
-
@Kerrek:如果表达式调用库或外部模块中的函数,编译器可能没有足够的信息来优化它。
标签: c++ templates gcc macros evaluation