【问题标题】:Calling method multiple times in c++在 C++ 中多次调用方法
【发布时间】:2018-11-02 10:38:30
【问题描述】:

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

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


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

  ..some operations..
}

在methodX内部,编译器会优化对methodY的调用两次还是任其发展?

【问题讨论】:

  • 为什么这个标签是C? (另一方面:== true 是多余的、重复的和多余的。)
  • bool result=methodY(); if result, return result不是更“简单”更“优化”吗?
  • @M.K 或者只是if (methodY()) return true; 如果变量在使用时总是具有相同的值,则无需存储它。
  • 为什么不简单地看一下生成的程序集呢?为什么不写一些更详细的代码呢?如果确实需要调用两次,则执行,否则不执行。如果不是,为什么要编写这样的代码?任何人类读者都会在这里挣扎!
  • 你为什么想知道?编译器生成的输出表现得好像它会完全按照您告诉它做的那样做。如果methodX 有副作用,你不必担心它们执行的次数太少。如果不是,您仍然不必太在意优化,但更好地关心编写可读代码

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


【解决方案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,而是直接执行三个打印。所以在这种情况下,函数被优化掉了。

【讨论】:

  • 有一个规则。参见例如:stackoverflow.com/questions/15718262/…
  • @user463035818 这是一条不同的规则。编译器是否优化函数调用不是一个规则。而且..从汇编示例中可以看出,编译器确实优化了函数调用仍然遵守“as-if”规则
  • 如果可观察到的行为与函数调用相同,则允许编译器优化函数调用。为什么你认为这个案例不同?
  • @user463035818 “as-if”规则始终适用,但编译器是否会优化 OPs 代码没有规则
  • @user463035818 是的,我认为您误解了我要说的内容。 “as-if”规则描述了(如您所说)如何允许编译器进行优化。但是“as-if”规则确实告诉是否编译器会进行优化。这就是 OP 所要求的 - 引用:“.. 编译器会优化..”,答案是没有规则编译器 *will
猜你喜欢
  • 2020-11-20
  • 2013-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多