c++ - 是否可以在不使用指针的情况下将变量的范围扩展到 if 语句之外?

标签 c++ if-statement scope stack

我有一个简单的 Trace 类,用于记录进入和退出方法:

#include <iostream>

class Trace
{
public:
    Trace()   {std::cout << "Enter" << std::endl;}

    ~Trace()
    {
        std::cout << "Exit" << std::endl;    
    }
};

void foo()
{
    Trace trace;
    std::cout << "foo..." << std::endl;    
}

int main()
{
    foo();
    return 0;
}

输出:

Enter
foo...
Exit

现在我希望能够启用/禁用跟踪。所以我会做这样的事情:

#include <iostream>

class Trace
{
public:
    Trace()   {std::cout << "Enter" << std::endl;}

    ~Trace()
    {
        std::cout << "Exit" << std::endl;    
    }
    static bool enabled;
};
bool Trace::enabled = false;

void foo()
{
    if(Trace::enabled)
        Trace trace;
    std::cout << "foo..." << std::endl;    
}

int main()
{
    Trace::enabled = true;
    foo();
    return 0;
}

问题是现在 trace 实例的范围限定为 if 语句,因此会产生以下输出:

Enter
Exit
foo...

有没有办法在不使用智能指针的情况下在后一种情况下获得正确的输出?如果禁用跟踪,我希望开销尽可能少。

P.S. 请注意,我的真实世界 Trace 类包含更多行,而不仅仅是“Enter”和“Exit”。

P.S.2 出于性能考虑,如果禁用跟踪,我不希望在堆栈上创建 trace 实例。

最佳答案

Is there any way to get the right output in the latter case, without using smart pointers? I want to have the least overhead possible if tracing is disabled.

现代编译器完全优化了简单的智能指针。您应该在代码中有意义的地方随意使用 RAII 和智能指针。干净、清晰地编写代码,避免像这样的微优化,因为它们几乎无济于事,而且经常使事情变得更糟。

关于c++ - 是否可以在不使用指针的情况下将变量的范围扩展到 if 语句之外?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32691118/

相关文章:

c++ - 如何在类函数中正确初始化指针?

java - 为什么我的 if else 语句(即? : ) does not work?

dart - 打印变量超出范围不会产生错误

javascript - 在范围内定位变量?

javascript - 与 JavaScript 作用域链交互

c++ - C++ Battery Collector 教程的编译错误

c++ - "Ambiguous conversion sequence"- 这个概念的目的是什么?

C++ 继承练习

r - 在 R 中格式化电话号码

android - 如果用作表达式,'if' 必须同时具有 main 和 'else' 分支