GCC испускает дополнительный код для разыменования boost :: shared_ptr - PullRequest
4 голосов
/ 22 марта 2010

У меня есть следующий код:

#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.

1 Ответ

7 голосов
/ 22 марта 2010

Это не «избыточная» инструкция.

Соответствующий раздел первого фрагмента кода эквивалентен: * p

, а во втором он эквивалентен: ** p

Из-за внутренних свойств shared_ptr существует второй уровень косвенности.Это не то, что оптимизатор может «исправить».

В любом случае, разница незначительна.

РЕДАКТИРОВАТЬ:

Упс!Приношу свои извинения, я неправильно прочитал ваш код.

Вы передаете shared_ptr ОТ ССЫЛКИ в свой код.Это передаст его «по указателю» на уровне ASM.

Итак, вы передаете указатель на shared_ptr, и этот shared_ptr содержит указатель на ваш объект.

Отсюда два уровняпо косвенности.

Извините за путаницу.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...