gpt4 book ai didi

c++ - 编译器会自动优化对数学函数的重复调用吗?

转载 作者:IT老高 更新时间:2023-10-28 22:17:16 28 4
gpt4 key购买 nike

假设我有这段代码:

#include <cmath>

// ...

float f = rand();
std::cout << sin(f) << " " << sin(f);

由于 sin(f) 是一个定义明确的函数,因此很容易优化:

float f = rand();
float sin_f = sin(f);
std::cout << sin_f << " " << sin_f;

这是一种期望现代 C++ 编译器自行完成的优化吗?或者编译器没有办法确定 sin(f) 应该总是为 f 的相等值返回相同的值?

最佳答案

使用使用默认优化标志构建的 g++:

float f = rand();
40117e: e8 75 01 00 00 call 4012f8 <_rand>
401183: 89 44 24 1c mov %eax,0x1c(%esp)
401187: db 44 24 1c fildl 0x1c(%esp)
40118b: d9 5c 24 2c fstps 0x2c(%esp)
std::cout << sin(f) << " " << sin(f);
40118f: d9 44 24 2c flds 0x2c(%esp)
401193: dd 1c 24 fstpl (%esp)
401196: e8 65 01 00 00 call 401300 <_sin> <----- 1st call
40119b: dd 5c 24 10 fstpl 0x10(%esp)
40119f: d9 44 24 2c flds 0x2c(%esp)
4011a3: dd 1c 24 fstpl (%esp)
4011a6: e8 55 01 00 00 call 401300 <_sin> <----- 2nd call
4011ab: dd 5c 24 04 fstpl 0x4(%esp)
4011af: c7 04 24 e8 60 40 00 movl $0x4060e8,(%esp)

使用 -O2 构建:

float f = rand();
4011af: e8 24 01 00 00 call 4012d8 <_rand>
4011b4: 89 44 24 1c mov %eax,0x1c(%esp)
4011b8: db 44 24 1c fildl 0x1c(%esp)
std::cout << sin(f) << " " << sin(f);
4011bc: dd 1c 24 fstpl (%esp)
4011bf: e8 1c 01 00 00 call 4012e0 <_sin> <----- 1 call

由此我们可以看出,没有优化的编译器使用了 2 次调用,而只有 1 次进行了优化,凭经验我猜,我们可以说编译器确实优化了调用。

关于c++ - 编译器会自动优化对数学函数的重复调用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14509628/

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