在C ++中多次调用方法

时间:2018-11-02 10:38:30

标签: c++ c++11 compiler-optimization

我想知道gcc编译器是否优化了以下方法调用。

bool methodY()
{
  ..some operations..
  return true;
}


int methodX() {
  if(methodY() == true)
    return methodY();

  ..some operations..
}

在methodX内,编译器会优化两次methodY的调用还是顺其自然?

1 个答案:

答案 0 :(得分:1)

  

..编译器将两次优化methodY的调用还是让它执行?

没有规则。这取决于编译器。

例如,如果methodY始终返回true,则允许编译器通过内联methodY来优化代码,例如:

int methodX() {
  ..some operations..  (from methodY)
  ..some operations..  (from methodY)
  return true;
}

但是无论是否会做到,我们不能只看C ++源代码就可以知道。

使用gcc,您可以使用选项-S生成程序集源文件(.s文件)。查看该文件是判断编译器执行操作的方式。

您还可以使用一些在线网站,例如https://godbolt.org/。这是一个示例:

#include <stdio.h>

int methodY()
{
  printf("y\n");
  return 1;
}

int methodX() {
  if(methodY() == 1)
    return methodY();

  return 0;
}

int main(){
  if (methodX()) printf("m\n");
  return 0;
}

-O3编译后显示:

.LC0:
  .string "y"
methodY():
  sub rsp, 8
  mov edi, OFFSET FLAT:.LC0
  call puts
  mov eax, 1
  add rsp, 8
  ret
methodX():
  sub rsp, 8
  mov edi, OFFSET FLAT:.LC0
  call puts
  mov edi, OFFSET FLAT:.LC0
  call puts
  mov eax, 1
  add rsp, 8
  ret
.LC1:
  .string "m"
main:
  sub rsp, 8
  mov edi, OFFSET FLAT:.LC0
  call puts
  mov edi, OFFSET FLAT:.LC0
  call puts
  mov edi, OFFSET FLAT:.LC1
  call puts
  xor eax, eax
  add rsp, 8
  ret

如您所见,main从不调用methodX,而只需直接打印三张照片。因此,在这种情况下,功能已被优化。