加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

在内联时,是否有任何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)

无条件地召唤三次.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读