我有一个简单的 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/