c++ - 性能:C++ 中的指针取消引用

标签 c++ performance pointers

每次我循环遍历一个类中的数组时,我通过指针访问它,我都会问自己这个同样的问题:

每次迭代是否会因取消引用指针而产生开销?取消引用链加起来了吗? 例如:

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() 的实现不会更改 ab 的值,然后它们将被迫生成对 a 进行单独取消引用的代码b 用于每次循环迭代,只是为了确保即使 ab 的值发生变化也能正确执行。

如果您不介意阅读一些汇编代码,您可以自己找出会发生什么——只需将程序编译为汇编代码,并启用优化(例如 g++ -O3 -S mytest.cpp) 并读取生成的 mytest.S 文件以查看编译器做了什么。尝试在同一个文件中实现 foo()(以便编译器可以明确地看到 foo() 的内容)和在不同文件中实现 foo(这样编译器可能不得不将 foo() 视为“黑色”框'),看看有什么不同。

关于c++ - 性能:C++ 中的指针取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45497371/

相关文章:

c - 在 C 中使用结构体和指针时遇到问题

c++ - C和C++的指针区别

c++ - recv 传入 0 以检测套接字错误是否安全?

performance - (内置)Lua 函数的本地声明以减少开销

c - 好的老初学者 killer : Pointers

c++ - 理解 C++ 中指向 const 值的 const 指针

c++ - 并发 STL it++ 和 *it 安全吗?

c++ - 没有有用且可靠的方法来检测 C/C++ 中的整数溢出?

performance - 标记扫描GC怎么了?

sql - 返回的列数是否会影响查询的速度?