“地址”运营商&amp ;?的性能如何?

时间:2013-05-17 03:51:25

标签: c++ performance addressof

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

(做了很多矩阵多,而CUBLAS库坚持指针......)

4 个答案:

答案 0 :(得分:10)

不 - 运营商的地址与您希望的任何东西一样便宜/快捷。它可能可能重载它,并且这样的重载可能更慢,但是重载它是相当不寻常的。

答案 1 :(得分:4)

std::addressof根本不会受到任何惩罚。当它归结为汇编代码时,我们只通过它们的地址引用对象,因此信息已经存在。

关于operator&,取决于它是否已超载。原始的非重载版本的行为与std::addressof完全相同。但是如果operator&已经过载(这无论如何都是一个非常糟糕的主意,并且非常不满意),所有的赌注都已关闭,因为我们无法猜测重载的实现将会是什么。

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

答案 2 :(得分:1)

在C ++中有引用,你所描述的内容听起来更像是C语言而不是C ++的行为。

它通常用于避免复制的C ++方法的那种签名,默认情况下,当你调用一个方法并向它传递一些参数时,这个参数生成一个本地副本,引用它是一种技术,可以帮助你避免这种开销副本。

答案 3 :(得分:1)

效率很高。如果您使用的是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_>

这种情况下的参考实际上与上述相同。