按值、性能和唯一性传递对象\u ptr 我正在使用一个C++文库,它不是我写的。 目前,我正试图通过删除大量循环依赖项来改进该库

按值、性能和唯一性传递对象\u ptr 我正在使用一个C++文库,它不是我写的。 目前,我正试图通过删除大量循环依赖项来改进该库,c++,c++11,C++,C++11,图书馆通过网络进行通信,并有一些消息类,这些消息类是在读取从网络接收的数据时创建的 目前,它的工作原理如下: 解析消息并创建一个std::unique_ptr 消息通过std::move(msg) 我删除了网络解析器对父对象的循环依赖,而是使用了一个信号,它发出一个std::shared\u ptr。 我想知道仅仅通过值而不是共享\u ptr传递消息是否是个坏主意。这会降低性能吗 库传递许多具有唯一性的对象,如本例所示。这是好的做法吗 提前谢谢 编辑: 消息 由三个无符号int和一个std:

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

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

  • 解析消息并创建一个
    std::unique_ptr
  • 消息通过
    std::move(msg)
我删除了网络解析器对父对象的循环依赖,而是使用了一个信号,它发出一个
std::shared\u ptr
。 我想知道仅仅通过值而不是
共享\u ptr
传递消息是否是个坏主意。这会降低性能吗

库传递许多具有
唯一性的对象,如本例所示。这是好的做法吗

提前谢谢

编辑:

消息

由三个
无符号int
和一个
std::map
组成,其中包含的字符串不超过几个

消息有多大,大的部分是否可以移动

如果消息是一个int和两个std::strings,那么move构造函数应该非常快。这是否会降低你的表现取决于你做了多少

但是,如果邮件太大,请小心复制

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


正如您所说,由于其可读性,传递值更可取,并且应该始终是您的首选。只有在分析速度较慢的情况下,您才应该寻找其他解决方案。

一般来说,封装在共享指针中的非常量对象不适合固有的异步和线程应用程序。由于防止了潜在的数据竞争,应用程序可能变得更加复杂

最好是通过值或唯一指针传递对象,除非这些对象是常量


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

如果您通过网络接收到消息,复制可能不会有问题。因此,是否按值传递对象,而不是唯一的\u ptr?我认为这会更具可读性。还是有什么缺点?通过值传递肯定会复制地图。这是否可行取决于您的应用程序。如果您偶尔只处理一次消息,并且不太关心消息传递的延迟,那么它应该是可行的。恐怕只有分析才能给你一个明确的答案。我用你要求的信息编辑了这个问题。在我看来,使用unique_ptr或仅仅通过值传递东西会更好吗?这会导致更可读的代码。当使用单个std::函数时,这可能不是线程安全的,是吗?我认为boost::signals2是线程安全的,在signals2中注册是线程安全的。对于std::function,赋值是不正确的。但是你需要吗?你的类是否真的开始在一个线程中接收消息,而回调还没有完全注册?你使用移动语义是什么意思?通过传递值?我认为通过使用共享\指针/唯一\指针,对象的使用是线程safe@schlimpf移动语义:请参见。关于线程安全:shared_指针本身是线程安全的,它指向的对象(可能)需要额外的同步。