c++ - GCC 发出用于 boost::shared_ptr 取消引用的额外代码

标签 c++ gcc compiler-construction boost assembly

我有以下代码:

#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;
}

我以为编译器会创建相同的代码,但对于 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

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

编译g++ 4.1.2-O3 -NDEBUG

最佳答案

这不是“冗余”指令。

第一个代码片段的相关部分相当于: *p

而在第二个中它等同于: **p

由于 shared_ptr 的内部结构,存在二级间接。这不是优化器可以“修复”的问题。

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

编辑:

糟糕!抱歉,我误读了您的代码。

您在代码中通过引用传递 shared_ptr。这将在 ASM 级别“通过指针”传递它。

因此,您正在传递一个指向 shared_ptr 的指针,而该 shared_ptr 包含一个指向您的对象的指针。

因此有两个间接级别。

抱歉造成混淆。 :)

关于c++ - GCC 发出用于 boost::shared_ptr 取消引用的额外代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2489128/

相关文章:

c - 编译 GCC Ubuntu : undefined reference to 时出错

c++ - arm gcc5 的交叉编译 - 正确使用 memcpy

c++ - vc++ 中出现运行时错误,但 gcc 中没有

c++ - 哪些标志将改善 gcc/clang 编译时间?

c++ - 连接两个写入此缓冲区开头的字符串的函数?

c++ - 返回不同类型的模板函数

c++ - 如何在 MSVC 中使用使用 MingW 编译的库?

c++ - 为什么 strtok 采用 char* 而不是 const char*?

php - 编译成 PHP 的编程语言?

compiler-construction - 为什么要收集垃圾?为什么编译器不自动插入 free() 呢?