Вызов метода несколько раз в C ++ - PullRequest
0 голосов
/ 02 ноября 2018

Я хочу знать, оптимизирует ли компилятор gcc следующие вызовы методов.

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


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

  ..some operations..
}

Внутри метода X, оптимизирует ли компилятор вызов метода Y два раза, или он просто допустит это?

1 Ответ

0 голосов
/ 02 ноября 2018

.. будет ли компилятор оптимизировать вызов метода Y два раза или просто допустит?

Для этого нет правила. Это зависит от компилятора.

Например, если 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, а просто делает три распечатки напрямую. Так что в этом случае функции были оптимизированы.

...