通过值或const-ref传递std::shared_ptr,然后存储在容器中
Passing std::shared_ptr by value or const ref and then storing in a container?
考虑以下向量:
std::vector<std::shared_ptr<X>> myVector;
以及以下两个将给定元素添加到向量的函数:
void foo1(std::shared_ptr<X> x)
{
myVector.push_back(x);
}
void foo2(const std::shared_ptr<X>& x)
{
myVector.push_back(x);
}
我的理解是,这两个函数都将shared_ptr
到X
推送到向量中,从而增加X
的ref计数。第一个函数导致参考计数的额外递增和递减,但这是不必要的。
我的理解正确吗?因此,第二种选择是否更可取?
在foo1
中,按值传递参数(即共享指针)。因此,std::shared_ptr<X>
的复制构造函数将被调用(即,当在foo1
的}
调用本地复制的析构函数时,ref计数器将被增加,然后减少)。
在foo2
中,通过const
引用传递参数(即共享指针)。因此,您可以传递原始对象的const
限定别名(即,ref计数器不会增加)。
您也可以在以下示例中看到这一点:
struct X {};
void foo1(std::shared_ptr<X> x) {
std::cout << "count in foo1(): " << x.use_count() << std::endl;
}
void foo2(const std::shared_ptr<X>& x) {
std::cout << "count in foo2(): " << x.use_count() << std::endl;
}
int main() {
std::shared_ptr<X> x(new X);
std::cout << "count in main(): " << x.use_count() << std::endl;
foo1(x);
foo2(x);
}
输出:
count in main(): 1
count in foo1(): 2
count in foo2(): 1
正如您在foo1
中看到的,不同的shared_ptr实例的数量是2。即main
中定义的原始shared_ptr
和foo1
中的副本。而在foo2
中,ref计数器保持为1。
因此,你的推理是正确的。
您应该将函数重写为:
void foo1(std::shared_ptr<X> x)
{
myVector.emplace_back(std::move(x));
}
void foo2(const std::shared_ptr<X>& x)
{
myVector.emplace_back(x);
}
然后两个版本都应该更高效,哪一个版本取决于情况和特定的编译器,如果有差异的话,很可能会非常小。
通常最好通过引用传递共享指针,因为原子增量往往会降低性能。在你的情况下,它不会被注意到,因为你无论如何都会在事后复制它。
相关文章:
- 如何存储用户输入的所有数据,然后在他们想要查看所有数据时显示它们
- 使用 std::map 存储在 std::any 中,然后通过 std::any_cast 访问
- 从文本文件读取,然后将项目存储到列表中
- 如何在循环中使用scanf,将值存储到一个变量中,然后打印出来?
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- 我正在编写一个代码来将 int 数组存储在文件中,然后用 c++ 检索它,但是检索第一项是假值,我该如何解决这个问题?
- 如何存储多个用户输入,然后以C++显示它们
- 如何在每次循环迭代期间生成向量,存储数据,然后删除该向量?
- 正在使用放置-new,复制存储,然后访问值未定义的行为
- 如何使类函数返回数组,然后将其调用并存储在 main 中
- 如果结果存储在变量中forward_as_tuple然后在 std::apply 中使用之前丢失右值引用
- 如何在给定任意数量的整数的情况下创建一个唯一键?并使用该键存储,然后从地图中查找
- 将25个甚至整数存储到一个名为intlist的整数阵列中,然后在屏幕上显示数组,并在屏幕上显示名为fivintegers
- 如何修改数组,从中删除空格,然后将其存储在新数组中
- 如何将元素的索引从2D数组存储到1D数组中,然后交换这些值
- 获取一个输入字符串,将其转换为其十六进制值,然后将其十六进制存储为 int
- 从数组中获取值并计算平均值,然后存储在数组中
- 将具有任意参数和占位符的函数存储在类中,然后再调用它
- 将用户输入的前两个单词分隔一个空格,然后存储剩余短语(C++)
- 通过值或const-ref传递std::shared_ptr,然后存储在容器中