C++ 什么';“这是”的表现;地址;操作员&;?

C++ 什么';“这是”的表现;地址;操作员&;?,c++,performance,addressof,C++,Performance,Addressof,在一个大循环中,我必须在代码中传递很多指针(因此我有很多表达式,比如foo(&x,&y,…))。我想知道是否应该将指针存储为单独的变量(即缓存),以提高性能(代价是在代码中引入更多变量和混乱) (做很多矩阵的运算,而库库坚持指针……)< /P> < P> C++中有引用,你所描述的听起来更像是C语言的行为,而不是C++。 C++的那种签名方法,通常是为了避免复制,默认情况下,当调用方法并传递一些参数时,这些参数会生成本地副本,有了引用,这是一种帮助您避免复制开销的技术。不——操作员的地址与您希

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


(做很多矩阵的运算,而库库坚持指针……)< /P> < P> C++中有引用,你所描述的听起来更像是C语言的行为,而不是C++。


C++的那种签名方法,通常是为了避免复制,默认情况下,当调用方法并传递一些参数时,这些参数会生成本地副本,有了引用,这是一种帮助您避免复制开销的技术。

不——操作员的地址与您希望的一样便宜/快捷。可以重载它,这样的重载速度可能会慢一些,但重载它是相当不寻常的。

std::addressof
不会招致任何惩罚。当它归结为汇编代码时,我们只通过对象的地址引用对象,所以信息已经在手边了

关于
操作符&
,这取决于它是否被重载。原始的非重载版本的行为与
std::addressof
完全相同。但是,如果
操作符&
被重载(无论如何,这是一个非常糟糕的主意,并且非常不受欢迎),那么所有的赌注都没有了,因为我们无法猜测重载的实现将是什么


因此,您的问题的答案是:不需要单独存储指针,只要在需要时使用
std::addressof
操作符&
,即使您必须重复它。

这将非常有效。如果您使用的是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_>
fooP(&var1和&var2);
8048642:8d 44 24 1c lea 0x1c(%esp),%eax->这是为了获取var2到eax的地址
8048646:89 44 24 04 mov%eax,0x4(%esp)->这是为了将地址保存到堆栈中以供以后的fooP调用
804864a:8d 44 24 18 lea 0x18(%esp),%eax->var1的地址
804864e:89 04 24 mov%eax,(%esp)
8048651:e8为ff ff ff呼叫8048614

这种情况下的引用与上面的情况是一样的。

优化器可以比你更好地回答这个问题。这是一种不值得思考的宏优化。如果操作员地址慢了,C就不会是现在的,更不用说C++了,但是为什么你说<> >超载它是非常不寻常的。?@GrijeshChauhan:好吧,希望超载是一种邪恶的撒旦行为这一事实应该会阻止足够多的人这么做,使其变得不同寻常。这似乎就是发生的事情。我当然不经常看到这种情况。是吗?@BenjaminLindley:)你说得对,因为我没有榜样……谢谢!