Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++;函数,指针与索引数组_C++_Optimization_Pointers_Compiler Construction_Paging - Fatal编程技术网

C++ 在c++;函数,指针与索引数组

C++ 在c++;函数,指针与索引数组,c++,optimization,pointers,compiler-construction,paging,C++,Optimization,Pointers,Compiler Construction,Paging,这个问题类似于已经提出的问题,但我认为没有考虑内存分页。因此,我在这里再次提出类似的问题: // version 1 int nums[100]; int* pNum = nums; for(int i=0;i<100;i++,pNum++){ foo(pNum); } // version 2 for(int i=0;i<100;i++){ foo(nums[i]); } //版本1 整数单位[100]; int*pNum=nums; 对于(int i=0;i来说,一般

这个问题类似于已经提出的问题,但我认为没有考虑内存分页。因此,我在这里再次提出类似的问题:

// version 1
int nums[100];
int* pNum = nums;
for(int i=0;i<100;i++,pNum++){
  foo(pNum);
}

// version 2
for(int i=0;i<100;i++){
  foo(nums[i]);
}
//版本1
整数单位[100];
int*pNum=nums;

对于(int i=0;i来说,一般的共识是对于基本类型,没有区别。大多数编译器将为此生成完全相同的代码(可能您指的是
foo(*pNum)

我知道它非常依赖于平台/编译器

正是

但是仍然想知道人们的普遍做法,特别是处理像图像处理或科学计算这样的大数据类型?谢谢


这两种做法都很常见,使用向量和迭代器也是如此。你担心的是极有可能是不相关的事情。使用最能表达你在思想上对算法进行可视化的方式,这样就更容易正确地维护和发展。

试着对这两种方法进行计时,自己看看。但我警告说,现代编译器我们非常有能力将一种形式转换为另一种形式。因此可能很难进行基准测试。您不应该担心这样的小细节。无论您如何编写,编译器都足够聪明来优化它。此外,像这样的微优化几乎都是在浪费时间;通常INEFI的来源要大得多效率。事实上,这是一个面试问题,我说了一些关于@templatetypedef的话,但我认为这对芯片制造商来说真的很重要。@Mysticial,如果我在编译器优化关闭时尝试这两个版本有意义吗?TBH,我以前确实玩过这个特定的优化。没有明确的赢家。他们不一样,但两者都不总是更快。当您递增多个指针时,这会变得很有趣。第一个版本有更多的增量,但第二个版本有间接寻址和更多的寄存器压力。我已经看到了高达50%的差异。但如前所述,它非常依赖于硬件和编译器的环境。我我认为这是一个微不足道的优化,太麻烦了。如果它不能产生相同的代码,我想它更可能“混乱”。在版本1上,因为它不是编写代码和使用指针的典型方式,编译器有时会遇到麻烦。您考虑缓存缺失/内存分页吗?假设PNUM当前指向地址基址+ 10×sieOf(int),在这种情况下,CPU可能会认为从BaseX地址+ 10×siZeof(int)到30×sieof(int)缓存。这是一个好主意。但是对于带有索引的数组,没有关于处理数组的哪一部分的提示?大多数编译器都可以选择输出asm代码(-S,例如在gcc上)。带有-O1的gcc为这两种情况生成完全相同的代码。