在我的 VC++(6.0) 项目中,有很多日志记录。日志记录由函数完成
void LogMsg(const char* formatStr, ...)
{
....
....
}
由于日志记录过于广泛,注释掉每一行会很慢。所以我注释了函数LogMsg的内容。
我的问题是,C++ 编译器是否足够聪明,可以忽略执行编译的函数和函数调用,还是会编译,并且由于空函数调用,我会在代码中进行不必要的跳转?
在我的 VC++(6.0) 项目中,有很多日志记录。日志记录由函数完成
void LogMsg(const char* formatStr, ...)
{
....
....
}
由于日志记录过于广泛,注释掉每一行会很慢。所以我注释了函数LogMsg的内容。
我的问题是,C++ 编译器是否足够聪明,可以忽略执行编译的函数和函数调用,还是会编译,并且由于空函数调用,我会在代码中进行不必要的跳转?
如果你想 100% 确定,而不依赖于编译器实际做了什么,你应该定义一个宏,如下所示:
#define LogMsg(...)
此宏应替换 LogMsg 函数的声明,并且您可以从代码中删除函数定义。如果您想保留在将来重新引入日志记录的可能性,您可以执行以下操作:
在头文件logging.h
#ifdef ENABLE_LOGGING
void LogMsg(const char* formatStr, ...)
#else
#define LogMsg(...)
#endif
在源文件logging.cpp
#ifdef ENABLE_LOGGING
void LogMsg(const char* formatStr, ...)
{
....
....
}
#endif
ENABLE_LOGGING
然后,您将通过在项目的预处理器定义中定义或不定义来启用或禁用日志记录。
如果编译器知道函数的主体,那么它可以弄清楚并删除不必要的跳转。事实上,今天的编译器尽可能内联大部分函数,因此您不必再担心不必要的跳转。