每次我循环遍历一个类中的数组时,我通过指针访问它,我都会问自己这个同样的问题:
每次迭代是否会因取消引用指针而产生开销?取消引用链加起来了吗? 例如:
ClassA *a = new ClassA();
ClassB *b = new ClassB();
for( int i = 0; i < 10; i++){
a->b->array[i].foo();
}
如果非要我猜的话,我会说这涉及 20 个解引用步骤,每个指针一个,10 次迭代。 但我也可以想象,它减少到 10,因为链接的指针被编译器转换为单个指针。我什至可以想象,由于某些缓存巫术之类的原因,它会减少到 1。
有人可以告诉我,也许可以向我解释一下这在性能方面的表现如何吗?非常感谢!
顺便说一句,我知道这里已经回答了类似的问题,但我无法推断出这个特定主题的答案。所以请不要怪我再提这个话题。
最佳答案
这实际上取决于编译器(尤其是优化器)如何生成代码。下as-if rule ,只要用户无法区分程序的外部行为方式,编译器就可以为所欲为,现代编译器在应用优化方面可以变得非常聪明。
在实践中,我认为最现代的优化器只有在无法判断 foo() 内部发生了什么时才无法优化循环——特别是,如果它们无法保证 foo() 的实现不会更改 a
或 b
的值,然后它们将被迫生成对 a
和 进行单独取消引用的代码b
用于每次循环迭代,只是为了确保即使 a
或 b
的值发生变化也能正确执行。
如果您不介意阅读一些汇编代码,您可以自己找出会发生什么——只需将程序编译为汇编代码,并启用优化(例如 g++ -O3 -S mytest.cpp
) 并读取生成的 mytest.S 文件以查看编译器做了什么。尝试在同一个文件中实现 foo()(以便编译器可以明确地看到 foo() 的内容)和在不同文件中实现 foo(这样编译器可能不得不将 foo() 视为“黑色”框'),看看有什么不同。
关于c++ - 性能:C++ 中的指针取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45497371/