"address of"操作员的性能如何?
What's the performance of the "address of" operator &?
我必须在我的代码中传递很多指针,在一个大循环的中间,(所以我有很多表达式,如foo(&x, &y, ...)
)。我想知道我是否应该存储指针作为单独的变量(即缓存)的性能(在我的代码中引入更多的变量和混乱的代价)?
(做大量的矩阵乘法。CUBLAS库坚持使用指针…)
不——地址运算符是你所期望的最便宜/最快速的。可以重载它,这样的重载可能会使变慢,但是完全重载它是相当罕见的。
std::addressof
完全不受处罚。当它归结为汇编代码时,我们只通过它们的地址引用对象,所以信息已经到手了。
对于operator&
,取决于其是否过载。原始的非重载版本的行为与std::addressof
完全相同。然而,如果operator&
被重载(这是一个非常糟糕的想法,而且非常不受欢迎),所有的赌注都取消了,因为我们无法猜测重载的实现将是什么。
所以你的问题的答案是:不需要单独存储指针,只要你需要它们,你就可以使用std::addressof
或operator&
,即使你必须重复它。
在c++中有引用,你所描述的听起来更像是C语言的行为,而不是c++。
这种c++方法的签名通常是为了避免复制,默认情况下,当你调用一个方法并向它传递一些参数时,这些参数会生成一个本地副本,有引用这是一种帮助你避免复制开销的技术
这将非常有效。如果使用的是Linux,可以使用objdump进行检查。下面是fooP(&var1, &var2)在x86架构中的样子。这只不过是一条LEA指令。
fooP(&var1, &var2);
8048642: 8d 44 24 1c lea 0x1c(%esp),%eax -> this is to get the address of var2 to eax
8048646: 89 44 24 04 mov %eax,0x4(%esp) -> this is to save the address to the stack for later fooP call
804864a: 8d 44 24 18 lea 0x18(%esp),%eax -> address of var1
804864e: 89 04 24 mov %eax,(%esp)
8048651: e8 be ff ff ff call 8048614 <_Z4fooPPiS_>
这个例子中的引用实际上与上面的相同
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 大小相等但成员数量不同的结构之间的性能差异
- 为什么constexpr的性能比正常表达式差
- 在类中使用随机生成器时出现性能问题
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 海湾合作委员会 ARM 性能下降
- GCC 和 Clang 代码性能的巨大差异
- 赛通"Cannot take address of memoryview slice"
- 在容量内调整矢量大小时的性能影响
- 了解算法的性能差异(如果以不同的编程语言实现)
- 未达到的情况会影响开关外壳性能
- QStringList vs list<shared_ptr<QString>> 性能比较C++
- 是否总是可以将使用递归编写的程序重写为不使用递归的程序C++,性能观点是什么?
- 哪种方法更好,性能明智
- C++ 特征库:引用的性能开销<>
- 与多个 for 循环与单个 for 循环 wrt 相关的性能从多映射获取数据
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- "address of"操作员的性能如何?