c++ - 访问硬编码数组和运行时初始化数组之间是否存在任何性能差异?

标签 c++ c arrays optimization hardcode

例如,我想使用数组 SQRT[i] 创建一个平方根表来优化游戏,但我不知道在访问 SQRT[i] 的值时,以下初始化之间是否存在性能差异:

  1. 硬编码数组

    int SQRT[]={0,1,1,1,2,2,2,2,2,3,3,.......255,255,255}
    
  2. 在运行时产生值(value)

    int SQRT[65536];
    int main(){
        for(int i=0;i<65536;i++){
            SQRT[i]=sqrt(i);
        }
        //other code
        return 0;
    }
    

访问它们的一些例子:

    if(SQRT[a*a+b*b]>something)
    ...

我不清楚程序是否以不同的方式存储或访问硬编码数组,也不知道编译器是否会优化硬编码数组以加快访问时间,是否有性能它们在访问数组时的区别?

最佳答案

首先,您应该正确处理硬编码数组:

static const int SQRT[]={0,1,1,1,2,2,2,2,2,3,3,.......255,255,255};

(也使用 uint8_t 而不是 int 可能更好,这样可以减少数组的大小并使其对缓存更友好)

与替代方案相比,这样做有一个很大的优势:编译器可以轻松检查数组的内容是否无法更改。

如果没有这个,编译器就必须变得偏执——每个函数调用都可能改变 SQRT 的内容,并且每个指针都可能指向 SQRT,因此任何通过 int*char* 写入可能会修改数组。如果编译器无法证明这不会发生,那么就会限制它可以进行的优化种类,在某些情况下这可能会影响性能。

另一个潜在的优势是能够在编译时解决涉及常量的问题。

如果需要,您可以巧妙地使用 __restrict__ 来帮助编译器解决问题。

在现代 C++ 中,您可以两全其美;应该可以(以合理的方式)编写在编译时运行的代码,将SQRT初始化为constexpr 。不过,最好问一个新问题。

关于c++ - 访问硬编码数组和运行时初始化数组之间是否存在任何性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31979042/

相关文章:

c - C 中的重复排列; Valgrind 错误

arrays - 数组索引超出搜索范围

python - 将 pandas 数据帧转换为 NumPy 数组

c++ - 使用 OpenMP 并行化此递归的最佳方法

C++ 函数调用路由解析器

c - 尝试使用 fgets 读取两行。为什么它只读第一行?

html - 当我们使用 CanVG 导出到 PNG 时,多行标题不起作用 - Highcharts

c++ - boost 是否具有比 STL 更简单的集合操作数据类型?

c++ - Qt-C++ : about how to use QFileInfo without object

c - 当 C 代码编译成机器代码时,栈上无缘无故地保留了 20 个字节