我有一个定义如下的函数:
void foo(std::shared_ptr<X> x) { ... };如果我向X声明一个共享ptr
std::shared_ptr<X> sourcePtr(new X(...));然后,我可以按如下方式调用foo:
foo(std::move(sourcePtr));或
foo(sourcePtr);我知道如果我使用第一个选项,那么sourcePtr将变为null。它是否也阻止了引用计数的递增?
如果这无关紧要,我应该选择哪个选项?在做出这样的决定时,我是否应该考虑其他因素?
发布于 2015-04-15 15:31:51
可以,如果将共享指针移动到函数中,则:
sourcePtr将变为null,如果您知道在函数调用之后将不再需要sourcePtr的值,那么将其移动到函数中是一种轻微的优化,因为它节省了原子增量(当sourcePtr超出作用域时,随后还会减少)。
但是,要注意标识符sourcePtr对于作用域的其余部分仍然有效,只是它持有一个空指针。这意味着如果你在移动之后使用它,编译器不会报错,但如果你忘记了它是从哪里移来的,你很可能会取消对null的引用。我经常使用这个“优化”的move,我也被它咬了几次:这个函数增加了更多的功能,如果你忘记撤销这个move,你就会崩溃。
因此,当你不再需要它的时候移动它是一个轻微的优化加上轻微的维护负担。在你的情况下,你可以权衡哪个更重要。
上面假设在其声明和对foo的最终调用之间存在实际使用sourcePtr的代码(感谢@WhozCraig指出这一点)。如果没有,最好直接在调用点创建指针:
foo(std::make_shared<X>(...));这样,您可以节省相同数量的原子操作,并且不会出现潜在危险的空共享指针。
https://stackoverflow.com/questions/29643974
复制相似问题