如何通过更好的性能传递和共享共享的所有权
How to pass and share shared_ptr ownership with a better performance?
例如
class A
{
public:
// Option 1
void setI_1(shared_ptr<int> i) { m_i = i; }
// Option 2
void setI_2(shared_ptr<int> i) { m_i = move(i); }
// Option 3
void setI_3(shared_ptr<int> const& i) { m_i = i; }
private:
shared_ptr<int> m_i;
};
通常哪种选项更好?
我在Visual Studio 2017上进行基准测试。选项2在所有测试的情况下,我都提供了最佳性能。在某些情况下,选项3的性能与选项2相似,但有些情况更糟。谢谢!
在您的情况下,选项2是最好的情况。您可能需要将指针移至课程,因此,当您不再需要它时,您无需一次又一次地增加参考表:
:{
shared_ptr<int> ptr = std::make_shared<int>(42);
A a;
a.setI_2(std::move(ptr)); // I no longer need ptr, so I can move it
};
指针移动到参数列表,ptr
为null/参数以R-Value-Reference初始化为ptr
,以便PTR获取null。然后将其从参数列表移动到成员,参数为null。您看到,没有(需要a(副本,这意味着参考counter的更改。
我只喜欢T const&
对于仅从参考读取并且不用于初始化另一个变量的函数。如果在示例中使用了带有引用的第三个选项,则需要复制指针,因为seti_3的主体在分配语句中具有副本(无移动(。
第一个选择显然是最坏的,因为指针被多次复制。
当您将shared_ptr
与unique_ptr
交换时,编译器迫使您使用最快的方式 - 移动。
我会添加第四个选项:
// Option 4
void setI_4(shared_ptr<int>&& i) { m_i = move(i); }
请注意,即使是 i
bee bee bee r-value-reference,在代码中使用时,它也不是r-value-reference,因此在没有移动时也会复制;
第四个选项仅与第二个选项不同,即传递的参数始终需要是r-value-Reference,而在第二个选项中,第二个选项是单独使用的i
是一个指针变量,而在第四个i
中是参考。(对于功能的主体可以做任何事情,但它生活在功能之外(std :: Move允许这样做((。参数变量是由来自呼叫者的参数核中的表达式构造的,如果不是R-Value-Reference,则shared_ptr
的构造函数自动复制指针(这意味着增加参考点(。p> seti_2的调用如下:
{
shared_ptr<int> ptr = std::make_shared<int>(42);
/// ptr owns 42
A a;
{ // a.setI_2(std::move(ptr));
// initializing the parameter
shared_ptr<int> i{std::move(ptr)};
// now i owns 42 and ptr no longer owns it and points to null
{ // the body of the function
a.m_i = std::move(i);
// now a.m_i owns 42 and i no longer owns it and points to null
};
};
};
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 在cuda线程之间共享大量常量数据
- 如何从具有移动语义的类对象中生成共享指针
- 在c代码之间共享数据的最佳方式
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 将静态库链接到不带-fPIC的共享库中
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 为什么std::互斥需要很长的、非常不规则的时间来共享
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 无法在Ubuntu上将共享库与Eclipse链接
- C++共享所有权与唯一所有权
- 如何通过更好的性能传递和共享共享的所有权
- 如何将所有权从一个共享指针向量转移到另一个向量?
- 一种不同的共享所有权
- C++:在共享所有权的情况下,C++11移动语义可以避免指针吗
- 使用 std::weak_ptr 共享资源所有权
- 智能指针,当c++ 11不支持时,它不会转移所有权,也不会被共享
- 共享所有权双重免费错误
- 如何增加std::共享指针的所有权计数