我必须在我的代码中传递很多指针,在一个大循环的中间,(所以我有很多表达式,如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_>
这个例子中的引用实际上与上面的相同