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