gpt4 book ai didi

c++ - 为什么未使用的参数不会被编译器丢弃?

转载 作者:行者123 更新时间:2023-12-01 22:35:26 26 4
gpt4 key购买 nike

我玩了一下编译器资源管理器(Godbolt),发现了一些我无法解释的东西。

假设我们有一个函数

int answer(){
return 42;
}

程序集如下所示(Clang 9,但其他编译器的行为类似):

    push    rbp
mov rbp, rsp
mov eax, 42
pop rbp
ret

这是相当合理的。现在,如果我们向函数引入一个未使用的参数,例如:

int answer( double d ){ // or even without name
return 42;
}

程序集更改为:

push    rbp
mov rbp, rsp
movsd qword ptr [rbp - 8], xmm0
mov eax, 42
pop rbp
ret

我的问题是为什么编译器不忽略 double 的移动,因为它显然没有被使用(并且编译器知道这一点,因为它提供了对此的警告)。这背后的原因是什么?

最佳答案

建议您在编译器选项框中输入-O1,您将看到优化结果:

mov  eax, 42
ret

您可以看到该版本中的参数没有执行任何操作。此外,没有创建或拆除任何堆栈帧,只是简单的“加载 retutn 值并退出”。

除非用户指定,否则没有什么理由执行优化(即使该指定是因为您的环境可能具有某些默认优化级别)。

关于c++ - 为什么未使用的参数不会被编译器丢弃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58555529/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com