GCC为boost :: shared_ptr取消引用发出额外的代码

Ale*_*x B 4 c++ compiler-construction assembly gcc boost

我有以下代码:

#include <boost/shared_ptr.hpp>

struct Foo { int a; };
static int A;

void
func_shared(const boost::shared_ptr<Foo> &foo) {
    A = foo->a;
}

void
func_raw(Foo * const foo) {
    A = foo->a;
}
Run Code Online (Sandbox Code Playgroud)

我认为编译器会创建相同的代码,但对于shared_ptr版本,会发出额外的看似冗余的指令.

Disassembly of section .text:

00000000 <func_raw(Foo*)>:
   0:   55                      push   ebp
   1:   89 e5                   mov    ebp,esp
   3:   8b 45 08                mov    eax,DWORD PTR [ebp+8]
   6:   5d                      pop    ebp
   7:   8b 00                   mov    eax,DWORD PTR [eax]
   9:   a3 00 00 00 00          mov    ds:0x0,eax
   e:   c3                      ret
   f:   90                      nop

00000010 <func_shared(boost::shared_ptr<Foo> const&)>:
  10:   55                      push   ebp
  11:   89 e5                   mov    ebp,esp
  13:   8b 45 08                mov    eax,DWORD PTR [ebp+8]
  16:   5d                      pop    ebp
  17:   8b 00                   mov    eax,DWORD PTR [eax]
  19:   8b 00                   mov    eax,DWORD PTR [eax]
  1b:   a3 00 00 00 00          mov    ds:0x0,eax
  20:   c3                      ret
Run Code Online (Sandbox Code Playgroud)

我只是好奇,这是必要的,还是只是优化者的缺点?

g++ 4.1.2,编译,-O3 -NDEBUG.

Rap*_*tor 7

这不是一个"冗余"的指令.

第一个代码段的相关部分等同于:*p

虽然在第二个它相当于:**p

由于shared_ptr的内部存在第二级间接.这不是优化器可以"修复"的东西.

无论如何,差异可以忽略不计.

编辑:

哎呦!道歉,我误读了你的代码.

您正在代码中传递shared_ptr BY REFERENCE.这将在ASM级别"通过指针"传递它.

所以你要传递一个指向shared_ptr的指针,而shared_ptr包含一个指向你对象的指针.

因此,两个层次的间接.

对困惑感到抱歉.:)