解除引用std :: tr1:shared_ptr与取消引用裸指针的任何打击?

Mar*_*rkD 3 c++ boost pointers smart-pointers tr1

我意识到创建,分配,复制和销毁std :: tr1 :: shared_ptr或boost :: shared_ptr(由于引用计数机制)会产生(有时很重要)性能损失.是否正确,一旦构造,访问由shared_ptr包装的指针没有性能损失?

换句话说:给定

std::tr1::shared_ptr<myClass> SharedA(new myClass);
myClass *NakedA = new myClass;
Run Code Online (Sandbox Code Playgroud)

SharedA->someClassMember
Run Code Online (Sandbox Code Playgroud)

有相同的开销

NakedA->someClassMember
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 9

在没有调试支持的优化构建中,不应该有任何开销.您可以通过查看您正在使用的实现来了解.有可能,它的operator->重载只返回指向指向对象的指针,它的operator*重载只是取消引用这个指针.

(这就是Visual C++ 2010实现的std::shared_ptr功能:每个重载操作符只调用一个只返回指针的"get"函数;没有任何类型的锁定或其他开销.其他实现可能不同.)

未经优化的构建可能不会内联运算符重载,并且如果您的实现具有您启用的额外调试支持,则它可能执行额外的检查(例如,如果您取消引用空指针,则可能是断言).