前向声明是否会禁用任何运行时优化?

Mar*_*ace 0 c++ optimization recursion forward-declaration compiler-optimization

我们可以转发声明一个函数:

void func1();

void func2() {
    // use func1
}

void func1() {
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

func1如果调用以下命令,这可能是必要的func2

void func1();

void func2() {
    func1();
}

void func1() {
    if (condition) {
        func2();
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然func1第二个示例中的内联并不困难,但我不知道在任意复杂的程序中是否存在此类编译器优化的理论障碍。在第二种情况下,前向声明是必要的,并且可能会丢失与程序的递归性质相关的编译器优化。

问题:当不需要但仍然使用前向声明时(例如第一个示例),任何主要编译器(gcc、clang、msvc)上是否会丢失任何编译器优化?

Jes*_*uhl 5

所知,冗余的前向声明不会抑制任何编译器优化。最坏的情况是,它们会提供一些额外的标记供编译器读取和处理,然后丢弃(可以忽略不计)。在某些情况下,前向声明可以改变后面代码的含义,在这种情况下,当然可能会对编译器优化器产生后续影响(但在这种情况下,您可能希望行为改变,所以不你可以做很多事情 - 它甚至可能是一个积极的影响)。

  • @MarkWallace 我不明白这是如何发生的。 (3认同)
  • @MarkWallace:像 GCC 和 clang 这样的现代编译器会在对其中的任何函数进行代码生成之前解析整个翻译单元。即使在“-O0”下,GCC“-funit-at-a-time”默认也是打开的。https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-funit-at-a-time 如果声明不会改变函数中任何代码的实际含义,那么这个答案是正确的,它如何解析为编译器内部优化的逻辑不会有什么不同。 (2认同)