【发布时间】:2023-03-06 08:02:01
【问题描述】:
我正在制作一个小型系统,我希望能够在整个系统中切换“详细”文本输出。
我制作了一个名为 globals.h 的文件:
namespace REBr{
extern bool console_verbose = false;
}
如果这是真的,我希望我的所有类在构造、破坏、复制或执行几乎任何操作时都向控制台打印一条消息。
例如:
window(string title="",int width=1280,int height=720):
Width(width),Height(height),title(title)
{
if(console_verbose){
std::cout<<"Generating window #"<<this->instanceCounter;
std::cout<<"-";
}
this->window=SDL_CreateWindow(title.c_str(),0,0,width,height,SDL_WINDOW_OPENGL);
if(console_verbose)
std::cout<<"-";
if(this->window)
{
this->glcontext = SDL_GL_CreateContext(window);
if(console_verbose)
std::cout<<".";
if(this->glcontext==NULL)
{
std::cout<<"FATAL ERROR IN REBr::WINDOW::CONSTR_OPENGLCONTEXT: "<<SDL_GetError()<<std::endl;
}
}
else std::cout<<"FATAL ERROR IN REBr::WINDOW::CONSTR_WINDOW: "<<SDL_GetError()<<std::endl;
if(console_verbose)
std::cout<<">done!"<<endl;
}
现在你可以看到我在那个构造函数中有很多 ifs。我真的不希望这样,因为这会减慢我的申请速度。我需要在不移除“加载栏”的情况下尽可能快(这有助于我确定程序在哪个函数停止运行)。
完成此任务的最佳/最快方法是什么?
我系统中的所有内容都在命名空间 REBr 下
【问题讨论】:
-
将
console_verbose标记为constexpr。如果ifs 的表达式被评估为false,这显然会导致编译器优化所有ifs。 -
另外,如果你想避免每次都输入
if(...),只需定义一个宏#define VERB_STREAM if(console_verbose) std::cout并像VERB_STREAM << "Generating window #" << this->instanceCounter << '-';一样使用它 -
你也应该看到这个问题:stackoverflow.com/q/6692238/1632887
-
“我真的不希望这样,因为这会减慢我的应用程序”:这绝对是不可避免的(除非您启用/禁用该功能编译时):必须进行测试某处的详细标志。顺便说一句,没有理由避免它,因为时间开销可以忽略不计。
-
Alexey 和 @chtz 感谢您提供非常有用的建议!这肯定会在我的程序中变得有用。我想我会选择一个定义或记录器类(就像布鲁斯提到的那样),但添加你的东西以使其更快。
标签: c++