当一个函数采用shared_ptr(来自boost或C++ 11 STL)时,你传递它:
通过const引用: void foo(const shared_ptr<T>& p)
或按价值:void foo(shared_ptr<T> p)?
我更喜欢第一种方法,因为我怀疑它会更快.但这真的值得吗还是还有其他问题吗?
您能否说出您选择的原因或案例,为什么您认为无关紧要.
我在整个应用程序中广泛使用std :: tr1 :: shared_ptr.这包括在函数参数中传递对象.考虑以下:
class Dataset {...}
void f( shared_ptr< Dataset const > pds ) {...}
void g( shared_ptr< Dataset const > pds ) {...}
...
Run Code Online (Sandbox Code Playgroud)
虽然通过shared_ptr传递数据集对象可以保证它在f和g中的存在,但是这些函数可能会被调用数百万次,这会导致很多shared_ptr对象被创建和销毁.这是最近一次运行的平坦gprof配置文件的片段:
Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 9.74 295.39 35.12 2451177304 0.00 0.00 std::tr1::__shared_count::__shared_count(std::tr1::__shared_count const&) 8.03 324.34 28.95 2451252116 0.00 0.00 std::tr1::__shared_count::~__shared_count()
因此,大约17%的运行时用于使用shared_ptr对象进行引用计数.这是正常的吗?
我的应用程序的很大一部分是单线程的,我正在考虑重写一些函数
void f( const Dataset& ds ) {...}
Run Code Online (Sandbox Code Playgroud)
并替换电话
shared_ptr< Dataset > pds( new Dataset(...) );
f( pds …Run Code Online (Sandbox Code Playgroud) 我在想,如果我需要检查是否sp是null之前我用它.纠正我,如果我错了,但创建一个别名不会增加ref计数器,因此通过进入方法我们正在使用共享指针,我们不知道嵌入式指针是否已被重置..我是正确的假设这个?
Class::MyFunction(std::shared_ptr<foo> &sp)
{
...
sp->do_something();
...
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找 Qt 智能指针的最佳实践。假设我有这样的事情。
void aFunction() {
QSharedPointer<QVector<QSharedPointer<Object> > > pointer = QSharedPointer<QVector<QSharedPointer<Object> > >(new QVector<QSharedPointer<Object> >);
doSomethingWithPointer(pointer);
changeOwnership(pointer);
}
Run Code Online (Sandbox Code Playgroud)
然后在 doSomethingWithPointer 函数中
void doSomethingWithPointer(QSharedPointer<QVector<QSharedPointer<Object> > > pointer) {
pointer->append(QSharedPointer<Object>(new Object);
}
Run Code Online (Sandbox Code Playgroud)
现在我在 doSomethingWithPointer 之后,将指针传递给 changeOwnership,它应该拥有它的所有权。我想知道的是 doSomethingWithPointer。在这样的函数中传递共享指针可以吗?或者我应该使用 QWeakPointer 因为 doSomethingWithPointer 实际上并不拥有指针的所有权?我什么时候应该使用 QWeakPointer?