我必须在一个大循环中传递我的代码中的很多指针(所以我有很多像foo(&x, &y, ...)
这样的表达式)。我想知道我是否应该将指针存储为单独的变量(即缓存)以提高性能(代价是在我的代码中引入更多变量和混乱)?
(做了很多矩阵多,而CUBLAS库坚持指针......)
答案 0 :(得分:10)
不 - 运营商的地址与您希望的任何东西一样便宜/快捷。它可能可能重载它,并且这样的重载可能更慢,但是重载它是相当不寻常的。
答案 1 :(得分:4)
std::addressof
根本不会受到任何惩罚。当它归结为汇编代码时,我们只通过它们的地址引用对象,因此信息已经存在。
关于operator&
,取决于它是否已超载。原始的非重载版本的行为与std::addressof
完全相同。但是如果operator&
已经过载(这无论如何都是一个非常糟糕的主意,并且非常不满意),所有的赌注都已关闭,因为我们无法猜测重载的实现将会是什么。
所以你的问题的答案是:不需要单独存储指针,只要你需要它们就可以使用std::addressof
或operator&
,即使你必须重复它。
答案 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_>
这种情况下的参考实际上与上述相同。