移动语义与pimpl

rub*_*nvb 5 c++ signals-slots c++14

我正在编写一个类的通用纯C++ 14实现,signal对连接对象进行生命周期跟踪,以及所有这些都适用于复制和移动操作的额外优势.

我现在发现有三种类型的实现是可能的:

  1. 使用全局connection_manager,管理所有连接.在高度并发的情况下,这将是非常糟糕的,其中许多信号和插槽被连接和断开,并且需要微调锁定以减轻这些问题中的一些.

  2. 每个信号存储其连接,并实现适当的移动和复制语义.这有两个缺点:信号对象很大,移动操作很昂贵(当信号或连接器移动时,所有连接都需要更新.这会使双方都有适当的移动构造器.

  3. 每个信号存储指向真实信号的指针.这种额外的间接级别使得移动更便宜,因为真正的连接对象保留在额外的间接级别后面的内存中.连接器也是如此,尽管每个信号发射都需要取消引用一个额外的指针才能获得真实对象.不需要显式实现移动语义.

目前,我几乎准备好了第2版.我不知道Qt究竟做了什么,但我知道它几乎涵盖了我想用信号/插槽做的一切,尽管没有复制/移动语义和预编译步骤.

我缺少的东西或者是第三位到底去,如果我不想对信号的用户(一个巨大的冲击的最好方式,即我不想增加他们的阶级的大小和复杂性只是因为我的信号/连接类每次移动/复制时都会做很多工作.

注意我正在寻找现实世界的经验和建议,而不是意见.