我意识到创建,分配,复制和销毁std :: tr1 :: shared_ptr或boost :: shared_ptr(由于引用计数机制)会产生(有时很重要)性能损失。是否正确,一旦构造,访问由shared_ptr包装的指针没有性能损失?
换句话说:给定
std::tr1::shared_ptr<myClass> SharedA(new myClass);
myClass *NakedA = new myClass;
确实
SharedA->someClassMember
与
具有相同的开销NakedA->someClassMember
答案 0 :(得分:9)
在没有调试支持的优化构建中,不应该有任何开销。您可以通过查看您正在使用的实现来了解。有可能,它的operator->
重载只返回指向指向对象的指针,它的operator*
重载只是取消引用这个指针。
(这就是std::shared_ptr
的Visual C ++ 2010实现:每个重载的运算符只调用一个只返回指针的“get”函数;没有任何类型的锁定或其他开销。实现可能会有所不同。)
未经优化的构建可能不会内联运算符重载,如果您的实现具有您启用的额外调试支持,它可能会执行额外的检查(例如,如果您取消引用空指针,则可能是断言)。
答案 1 :(得分:3)
智能指针的所有成员函数(包括解除引用运算符)都可以内联。任何好的编译器都应该优化抽象。