C++、GCC:避免评估无用的表达式

发布于 2025-01-04 12:28:52 字数 875 浏览 0 评论 0原文

我定义了一个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

一刻暧昧 2025-01-11 12:28:52

我不确定如果没有宏如何实现这一点。因此,作为参考,这里有一个类似于 google-glog 中使用的宏:

#define LOG (quiet) ? (void)0 : your_logging_object

其中 quiet 是一个布尔值。然后在代码的其他地方:

LOG << some_var;

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:

#define LOG (quiet) ? (void)0 : your_logging_object

where quiet is a boolean. Then elsewhere in your code:

LOG << some_var;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文