GCC 是否优化空方法调用?

问题描述 投票:0回答:1

以下方法运行良好,但我很好奇性能和优化。

示例我调用“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(书呆子)

c++ gcc optimization
1个回答
0
投票

当未定义

DEBUG
时,
Output
中对
OutputDebug
的调用将在预处理时(编译时之前)被删除。

如果启用优化(例如

-O2
-O3
),
OutputDebug
Output
调用可以由GCC内联。在这种情况下,将不会生成代码(即没有函数调用)。这很可能是这种情况,但只有当调用它们的函数位于“相同的翻译单元”中时才有可能。否则,需要链接时优化来进行此类优化(即跨翻译单元内联)。

Output

OutputDebug
函数都会生成。即使未定义
DEBUG
并且我们使用 -O3 标志,这也可以在
Godbolt
上看到。前者可以在编译时使用
static
关键字自动删除(甚至使用
static inline
进行更积极的优化)。假设调用它的函数位于同一个翻译单元中,则可以为后面做同样的事情。
    

© www.soinside.com 2019 - 2024. All rights reserved.