我有以下代码:
#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/