我有以下代码:
#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
进行编译。
答案 0 :(得分:7)
这不是'冗余'指令。
第一个代码段的相关部分相当于: * P
虽然在第二个它相当于: ** P
由于shared_ptr的内部存在第二级间接。这不是优化器可以“修复”的东西。
无论如何,差异可以忽略不计。
编辑:
糟糕!道歉,我误读了你的代码。
您正在代码中传递shared_ptr BY REFERENCE。这将在ASM级别“通过指针”传递它。
所以你要传递一个指向shared_ptr的指针,而shared_ptr包含一个指向你对象的指针。
因此有两个间接层次。
很抱歉这个混乱。 :)