如果我有以下功能:
void foo(DoThisSometimes,DoThisAlways) { if (DoThisSometimes == 1) { //Do stuff } //Do other stuff {
内联代码调用此函数,DoThisSometimes为0,是否有任何编译器可以从内联函数中删除这部分代码:
if (DoThisSometimes == 1) { //Do stuff }
解决方法
一个体面的编译器肯定应该做这个优化,而GCC确实如此.以下来源:
#include <cstdio> inline void foo(bool maybe) { if (maybe) { printf("Maybe\n"); } printf("Always\n"); } int main() { foo(true); foo(false); }
编译(使用优化-O3):
0000000000400410 <main>: 400410: 48 83 ec 08 sub $0x8,%rsp 400414: bf e4 05 40 00 mov $0x4005e4,%edi 400419: e8 d2 ff ff ff callq 4003f0 <puts@plt> 40041e: bf ea 05 40 00 mov $0x4005ea,%edi 400423: e8 c8 ff ff ff callq 4003f0 <puts@plt> 400428: bf ea 05 40 00 mov $0x4005ea,%edi 40042d: e8 be ff ff ff callq 4003f0 <puts@plt> 400432: 31 c0 xor %eax,%eax 400434: 48 83 c4 08 add $0x8,%rsp 400438: c3 retq 400439: 0f 1f 00 nopl (%rax)
无条件地召唤三次.