3

我意识到创建、分配、复制和销毁 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

?

4

2 回答 2

9

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

(这就是 Visual C++ 2010 的实现std::shared_ptr所做的:每个重载的运算符只调用一个“get”函数,它只返回指针;没有任何类型的锁定或其他开销。其他实现可能会有所不同。)

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

于 2011-05-18T18:45:52.097 回答
3

智能指针的所有成员函数,包括取消引用运算符,都可以内联。任何好的编译器都应该优化掉抽象。

于 2011-05-18T18:45:21.947 回答