Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 索引和替换的计算成本_C++_Matrix - Fatal编程技术网

C++ 索引和替换的计算成本

C++ 索引和替换的计算成本,c++,matrix,C++,Matrix,假设我有以下反替代代码 for (int i = n - 1; i >= 0; i--) { double temp = b[i]; if (i != n - 1) { for (int j = i + 1; j < n; j++) temp -= A[i][j] * b[j]; } b[i] = temp/A[i][i]; } for(int i=n-1;i>=0;i--){ 双温=b[i]; 如果(i!=

假设我有以下反替代代码

for (int i = n - 1; i >= 0; i--) {
    double temp = b[i];
    if (i != n - 1) {
        for (int j = i + 1; j < n; j++) 
            temp -= A[i][j] * b[j];
    }
    b[i] = temp/A[i][i];
}
for(int i=n-1;i>=0;i--){
双温=b[i];
如果(i!=n-1){
对于(int j=i+1;j
但对于我这个编程新手来说,以下内容似乎更简单:

for (int i = n - 1; i >= 0; i--) {
    if (i != n - 1) {
        for (int j = i + 1; j < n; j++) 
            b[i] -= A[i][j] * b[j];
    }
    b[i] /= A[i][i];
}
for(int i=n-1;i>=0;i--){
如果(i!=n-1){
对于(int j=i+1;j
每次从
j=i+1
迭代到
j=n-1
时,都需要对
b[i]
进行索引。但是这个
b[i]
是一个固定的量,因为这个迭代不依赖于
i
的值


但我不确定编者更喜欢哪一个。有什么帮助吗?

定义
double temp=b[i]鼓励编译器将计数
temp
保存在CPU的一个寄存器中。对于其他代码,编译器可能会将计数留在主存中,而寄存器不适合存储数组


阵列可能会被保存在缓存中,除非它非常大,所以它仍然相当快;但是寄存器速度更快。

一个好的优化器可能会通过将
b[i]
计算从内部循环中提升出来,将后者转换为前者。不管怎样,如果你关心表现,就要衡量它;如果你不测量,这意味着你并不真正在乎。@IgorTandetnik是的,但仍然:对我来说,OP有道理。过分依赖优化器通常是一种糟糕的风格,即使你相当确信优化会起作用。我不会使用索引(b[I]),而是使用指针和自动增量(*p++)。有趣的是,你应该问这个问题。我碰巧有一些自己的热点反替代代码。在你指出之前,我没有想到要把我的计分结果记在登记簿上。那么,我们两个中的哪一个在回答另一个的问题呢?我想这已经成为我们两个之间的合作了,不是吗?现在我们两个都将享受更快的代码。