编译器是否足够聪明以检测无操作功能?

Thi*_*man 3 c++

如果我写这样的函数:

void doMaybeNothing()
{ 
#ifndef IM_LAZY
   doSomething();
#endif
}
Run Code Online (Sandbox Code Playgroud)

现代编译器是否足够智能,可以检测无操作功能并进行优化,从而避免浪费周期?或者是否总会有一个小的性能影响?

Jam*_*lis 6

假设函数的主体在编译时或链接时可用(即,它不在动态链接库中),大多数现代编译器应该去掉对什么都不做的函数的调用(当然,如果启用了优化) .

实际上,这只是一种内联扩展的形式,只要结果相同,它就可以在函数体的任何地方扩展它.如果该函数什么都不做,那么只要内联它就会扩展为任何内容.


ken*_*ytm 5

像这样的简单函数将被内联和删除。

对于 gcc,输入类似

#include <stdio.h>

void no_op () {}

int main () {
    no_op();
    no_op();
    no_op();
    no_op();
    no_op();
    no_op();
    no_op();
    no_op();
    no_op();
    no_op();
    no_op();
    no_op();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果(与-O1)是

    .section __TEXT,__text,regular
    .section __TEXT,__textcoal_nt,coalesced
    .section __TEXT,__const_coal,coalesced
    .section __TEXT,__picsymbolstub4,symbol_stubs,none,16
    .text
    .align 2
    .globl _no_op
_no_op:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    @ link register save eliminated.
    @ lr needed for prologue
    bx  lr
    .align 2
    .globl _main
_main:
    @ args = 0, pretend = 0, frame = 0
    @ frame_needed = 0, uses_anonymous_args = 0
    @ link register save eliminated.
    @ lr needed for prologue
    mov r0, #0
    bx  lr
    .subsections_via_symbols
Run Code Online (Sandbox Code Playgroud)

请注意,不会生成对no_opin 的调用main