按值,性能和unique_ptr传递对象

时间:2014-02-19 10:14:51

标签: c++ c++11

我正在使用一个不是我编写的C ++库。 目前,我试图通过删除大量循环依赖来改进库。

libray通过网络进行通信,并有一些消息类,这些消息类是在读取从网络接收的数据时创建的。

目前,它的工作原理如下:

  • 解析邮件并创建std::unique_ptr<Message>
  • 使用std::move(msg)
  • 将消息传递给父对象

我删除了从网络解析器到父对象的循环依赖关系,并使用了一个信号,它发出std::shared_ptr<Message>。 我想知道按值而不是shared_ptr传递Message是不是一个坏主意。这会降低性能吗?

在这种情况下,库会传递许多带有unique_ptr的对象。这是好习惯吗?

提前致谢

修改

Message 由三个unsigned int和一个std::map<string, string>组成,不会包含多个字符串

2 个答案:

答案 0 :(得分:0)

信息有多大,可移动的大部分是什么?

如果你的消息是一个int和两个std :: strings,那么移动构造函数应该非常快。这是否会降低您的性能取决于您的性能。

但是,请注意复制邮件是否很大。

根据附加信息:按值传递。如果可以,请使用单个std :: function而不是boost :: signal,因为这样可以移动消息。

正如您所说,通过价值是可取的,因为它的可读性,应始终是您的首选。只有在分析显示速度慢的情况下才能寻找其他解决方案。

答案 1 :(得分:0)

通常,包含在shared_pointers中的非const对象不适合本身异步和线程化的应用程序。由于防止潜在的数据竞争,应用程序可能变得更加复杂。

通过value或unique_pointer传递对象可能更好,除非这些对象是const。

关于性能:您可以使用移动语义。