C++、GCC:避免评估无用的表达式
我定义了一个 Debug
类(类似于 Qt 中的 qDebug
),其中包含一个 operator<<
将数据流式传输到 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?
我认为使用模板的类似解决方案比使用宏的解决方案更干净且性能更好,但可能是错误的......
I defined a Debug
class (similar to qDebug
from Qt) with an operator<<
to stream data to stdout
.
According to its template parameter (that, in turn will depend on a macro DEBUG
), Debug
will be specialized: operator<<
of a specialization will print data, while the one of the other specialization will be quiet.
The following is the quiet version:
template< bool quiet = true >
class _Debug
{
public:
template< typename T >
_Debug& operator<<( const T & )
{
return *this;
}
};
I noticed, however, that parameters to operator<<
will be evaluated even if it's the quiet version:
Debug<1>() << "Var " << var.name();
I can see with a profiler that when running the above piece of code, expressions "Var"
and var.name()
are evaluated even if Debug<1>
is the quiet specialization of _Debug
.
Is there any way to avoid this? Maybe should I pass some options to GCC?
I thought that a similar solution using templates would be cleaner and perform better than a solution using macros, but was probably wrong...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我不确定如果没有宏如何实现这一点。因此,作为参考,这里有一个类似于 google-glog 中使用的宏:
其中
quiet
是一个布尔值。然后在代码的其他地方:I am not sure how this can be achieved without macros. So for reference, here is a macro similar to what used in google-glog:
where
quiet
is a boolean. Then elsewhere in your code: