在内联时,是否有任何C编译器删除if语句总是保持相同的答案?
发布时间:2020-12-16 09:42:43 所属栏目:百科 来源:网络整理
导读:如果我有以下功能: void foo(DoThisSometimes,DoThisAlways){ if (DoThisSometimes == 1) { //Do stuff } //Do other stuff{ 内联代码调用此函数,DoThisSometimes为0,是否有任何编译器可以从内联函数中删除这部分代码: if (DoThisSometimes == 1) { //Do s
如果我有以下功能:
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("Mayben"); } printf("Alwaysn"); } 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) 无条件地召唤三次. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |