c++ - 用查找表替换 math.h exp 调用

标签 c++ math.h

我想知道是否有必要修改代码以使用 math.h exp 的查找表,或者它是否由 clang++< 自动完成 当给定 -O3 标志时。

如果不是,是否有 #pragma 执行此操作?

澄清

我在谈论函数调用的内存。也就是说,如果函数传递了完全相同的参数(是的, float 实际上可以相同,如果它们是从常量和整数派生的)。

示例

假设我要运行 exp(-a*x) 其中 a 不是编译时常量,但一旦设置一次,它就不会被修改。类似地,x 可以是 10 个可能值之一,所有这些值都设置一次,并且不会再次修改。

最佳答案

我不太了解 clang 的具体细节,所以我无法详细说明它的作用。但我可以推断出它可以做什么。

如果参数是编译时常量,那么优化器可能能够在编译/链接时进行预计算。但这绝不是必需的,我也不希望所有编译器都这样做。

如果参数不是编译时常量,并且同一函数内的多个调用使用相同的参数(并且不涉及 volatile 对象),那么优化器可能会在知道函数不使用时重用结果有副作用。我建议您手动进行此优化,只是因为最好不要重复自己。

如果参数不是编译时常量,那么你可以将结果存储在某个地方的表中以备后用,但是加载值的内存访问可能比计算本身慢得多,所以这可能会结束是一种悲观。

显然,进行任何这些优化是否有任何意义将取决于许多方面,例如 CPU 架构、缓存等,最重要的是取决于操作是否首先对性能产生任何重大影响。

关于c++ - 用查找表替换 math.h exp 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49762186/

相关文章:

c++ - 来自 math.h 的 C/C++ log10 函数产生不正确的值

c - C语言中使用数组的Eratosthenes筛法

c - Pow:对重载函数的模糊调用

c++ - 递归的意外性能结果

c++ - 在 C 中合并 2 个排序数组

c - 使用 Infinity 和 NaN 禁用异常

c++ - 使用 math.h 时预期的初始值设定项在 'extern' 之前

c++ - 了解 C++11 内存栅栏

c++ - 集: C++ vs C#的快速交集

c++ - Visual C++ Win32 控制台应用程序 printf 在 while 循环中多行输出