3

简而言之,按值传递指针还是通过 const 引用传递指针更好?

我写了一个简单的函数来探索:

void foo(int* v) { std::cout << *v << endl; }

相对

void foo(int* const& v) { std::cout << *v << endl; }

我试图查看生成的程序集,但我并不是特别擅长组装,所以我不确定我是否理解其中的区别。但是有区别。在第一种情况下,我们得到:

pushq   %rbp
pushq   %rbx
subq    $8, %rsp
movl    (%rdi), %esi
movl    std::cout, %edi
call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)

在这种const&情况下,我们再进行一项操作:

pushq   %rbp
pushq   %rbx
subq    $8, %rsp
movq    (%rdi), %rax
movl    std::cout, %edi
movl    (%rax), %esi
call    std::basic_ostream<char, std::char_traits<char> >::operator<<(int)

这种差异是什么意思(三个mov而不是两个),这意味着什么?(基本上,我有一个可能是原始指针的结构Foo<T>,我想知道我的函数是否应该是. )。Tbar(const T&)bar(typename boost::call_traits<T>::type)

4

3 回答 3

9

按值传递指针,除非您需要引用语义。

通过引用传递几乎肯定是通过传递指针来实现的。您将传递与指针本身相同数量的数据,但会引入额外的间接级别,因此它可能比按值传递效率低。

话虽如此,差异可能很小。所以对于通用代码,通过 const 引用传递更简单,除非你真的需要在单个指令级别进行微优化。如果你这样做,那么正如你所说,boost::call_traits可以提供帮助。

于 2013-10-31T15:22:01.273 回答
1

通过引用传递指针将执行以下操作:

Address: 0x00  -  42   (int)
Address: 0x11  -  0x00 (int*)
Address: 0x22  -  0x11 (int* const&)

这基本上是编译器将为 int* const& 生成的内容。实施方面,它可能最终会成为 int**。

因此,按值传递指针最终会更有效率,因为您将直接复制 int 的地址,而不会产生第三行的开销。

于 2013-10-31T15:30:44.333 回答
0

对于指针,按值传递。根据定义,将指针传递给指针(这将在幕后发生)不会比传递指针更有效。汇编器中的额外行(我对此知之甚少)表明它实际上对您来说效率较低。

于 2013-10-31T15:23:21.383 回答