我想知道gcc编译器是否优化了以下方法调用。
bool methodY()
{
..some operations..
return true;
}
int methodX() {
if(methodY() == true)
return methodY();
..some operations..
}
在methodX内,编译器会优化两次methodY的调用还是顺其自然?
答案 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
,而只需直接打印三张照片。因此,在这种情况下,功能已被优化。