为什么condition_variable
不是MoveConstructible(根据http://en.cppreference.com/w/cpp/thread/condition_variable)?这禁止包含在许多容器中(例如std::unordered_map
)。
这迫使人们使用unique_ptr
,这会产生一个额外的堆分配,像make_shared
这样的东西是为了解决而构建的。此外,如果没有池分配器,这可能会变得非常低效。
答案 0 :(得分:5)
condition_variable
是一个同步构造,多个线程(可能)同时使用。 (事实上,这就是它的目的。)你怎么能安全地移动它?例如,假设它直接包含螺旋锁。某个线程在您的进程地址空间中的给定地址上旋转,您是否要将该对象从其下移出?
无法移动任何类型的用户模式同步构造。实际同步的事情需要一个固定的地址。您可以强制该对象在不会被移动的堆分配对象上完成所有实际工作 - 并且您可以直接进入要避免的堆的间接。 (内核模式同步结构可以移动:你已经掌握了一些操作系统的东西。但是它们使用的成本要高得多。)
它们也无法被复制 - 因为这意味着什么?
只需要这样。你的设计必须考虑到它,这就是全部。
(而且我并不真正理解你问题的第二段。make_shared
的目的是为了让重新计算成本更低,并且与移动内容没有任何关系。分配器可能会也可能不会改善任何特定情况,更不用说这种情况了,除非你测量它,否则你不会知道。)