我有下面的代码额外的代码:GCC发出升压:: shared_ptr的非关联
#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
编译。
如果您通过值而不是通过引用传递'shared_ptr',会发生什么?或者相反,如果你通过引用传递'Foo *'会发生什么? – greyfade 2010-03-21 23:09:55
@greyfade,奇怪的是,为函数发出的代码是完全一样的,但在调用网站的参考。计数由于复制而发生改变 – 2010-03-21 23:47:24