use*_*217 3 c++ performance pointers
每次我遍历类中的数组(通过指针访问)时,我都会问自己同样的问题:
每次迭代是否通过取消引用指针产生开销?取消引用链加起来吗?例如:
ClassA *a = new ClassA();
ClassB *b = new ClassB();
for( int i = 0; i < 10; i++){
a->b->array[i].foo();
}
Run Code Online (Sandbox Code Playgroud)
如果我不得不猜测,我会说这涉及 20 个取消引用步骤,每个指针一个,10 次迭代。但我也可以想象,它减少到 10 个,因为链接的指针被编译器翻译成一个。我什至可以想象,由于某些缓存伏都教或其他原因,它会减少到 1。
有人可以告诉我,也许可以向我解释,这在性能方面的表现如何?真的很感激!
顺便说一句,我知道这里已经回答了类似的问题,但我无法推断出这个特定主题的答案。所以请不要怪我再次提出这个话题。
这实际上取决于编译器(尤其是优化器)如何生成代码。在as-if 规则下,只要用户无法分辨程序外部行为的差异,编译器就可以为所欲为,现代编译器可以在它们应用的优化方面变得非常聪明。
在实践中,我认为最现代的优化器只有在他们无法判断 foo() 内部发生了什么时才能优化循环——特别是,如果他们不能保证 foo() 的实现不会改变aor的值b,那么它们将被迫生成代码,为每个循环迭代单独取消引用aand b,只是为了确保即使aorb的值发生变化也能发生正确的事情。
如果您不介意阅读一些汇编代码,您可以亲自了解会发生什么——只需将程序编译为汇编,启用优化(例如g++ -O3 -S mytest.cpp)并阅读生成的 mytest.S 文件以查看编译器做了什么。尝试使用在同一文件中实现的 foo()(以便编译器可以肯定地看到 foo() 的内容)和在不同文件中实现的 foo(因此编译器可能不得不将 foo() 视为“黑色” box'),看看有什么不同。
| 归档时间: |
|
| 查看次数: |
1997 次 |
| 最近记录: |