"address of"操作员的性能如何?

What's the performance of the "address of" operator &?

本文关键字:性能 address of 操作员      更新时间:2023-10-16

我必须在我的代码中传递很多指针,在一个大循环的中间,(所以我有很多表达式,如foo(&x, &y, ...))。我想知道我是否应该存储指针作为单独的变量(即缓存)的性能(在我的代码中引入更多的变量和混乱的代价)?

(做大量的矩阵乘法。CUBLAS库坚持使用指针…)

不——地址运算符是你所期望的最便宜/最快速的。可以重载它,这样的重载可能会使变慢,但是完全重载它是相当罕见的。

std::addressof完全不受处罚。当它归结为汇编代码时,我们只通过它们的地址引用对象,所以信息已经到手了。

对于operator&,取决于其是否过载。原始的非重载版本的行为与std::addressof完全相同。然而,如果operator&被重载(这是一个非常糟糕的想法,而且非常不受欢迎),所有的赌注都取消了,因为我们无法猜测重载的实现将是什么。

所以你的问题的答案是:不需要单独存储指针,只要你需要它们,你就可以使用std::addressofoperator&,即使你必须重复它。

在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_>

这个例子中的引用实际上与上面的相同