以下方法运行良好,但我很好奇性能和优化。
示例我调用“Output(str)”将某些内容发送到终端。我添加了一个仅在调试时输出的方法,如下所示。现在我想知道在不调试时这是否会产生毫无意义的空方法调用,我是否应该以不同的方式处理它。
bool OutputNewline = true;
Output(std::string str, bool newLine = true)
{
if (!OutputNewline)
{
putchar('\n');
OutputNewline = true;
}
if (str.length() == 0) { return; }
fputs(str.c_str(), stdout);
fflush(stdout);
OutputNewline = (str[str.length()-1] == '\n');
}
void OutputDebug(std::string str, bool newLine = true)
{
#if defined(DEBUG) && DEBUG == true
Output(str, newLine);
#endif
}
编译后查看/检查编译输出文件的最合适方法是什么,以查看编译输出中实际最终出现了哪些方法/字段。
g++ 12.2.0 Debian GNU/Linux 12(书呆子)
当未定义
DEBUG
时,Output
中对 OutputDebug
的调用将在预处理时(编译时之前)被删除。
如果启用优化(例如
-O2
或-O3
),OutputDebug
和Output
调用可以由GCC内联。在这种情况下,将不会生成代码(即没有函数调用)。这很可能是这种情况,但只有当调用它们的函数位于“相同的翻译单元”中时才有可能。否则,需要链接时优化来进行此类优化(即跨翻译单元内联)。
Output
和
OutputDebug
函数都会生成。即使未定义 DEBUG
并且我们使用 -O3
标志,这也可以在 Godbolt上看到。前者可以在编译时使用
static
关键字自动删除(甚至使用 static inline
进行更积极的优化)。假设调用它的函数位于同一个翻译单元中,则可以为后面做同样的事情。