如果我写这样的函数:
void doMaybeNothing()
{
#ifndef IM_LAZY
doSomething();
#endif
}
Run Code Online (Sandbox Code Playgroud)
现代编译器是否足够智能,可以检测无操作功能并进行优化,从而避免浪费周期?或者是否总会有一个小的性能影响?
假设函数的主体在编译时或链接时可用(即,它不在动态链接库中),大多数现代编译器应该去掉对什么都不做的函数的调用(当然,如果启用了优化) .
实际上,这只是一种内联扩展的形式,只要结果相同,它就可以在函数体的任何地方扩展它.如果该函数什么都不做,那么只要内联它就会扩展为任何内容.
像这样的简单函数将被内联和删除。
对于 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。