我在理解作者试图在他的新书3.3.3 Resource Management
的{{1}}部分中传达的内容时遇到了问题。我在作者主页的引用部分下面复制了一遍:
3.3.3资源管理 [tour2.copy.resource]
通过定义构造函数,复制操作,移动操作和a 析构者,a 程序员可以完全控制所包含资源的生命周期 (例如容器的元素)。特别是,移动构造函数允许 一个简单而廉价地从一个范围移动到另一个范围的对象。那样,我们 可以移动我们不能或不想从范围中复制的对象。 考虑表示并发活动的标准库线程(第5.3.1节) 和一百万双的矢量。我们不能复制前者而不想 复制后者。
The C++ Programming Language 4th edition
这使得资源句柄(例如Vector和thread)成为另一种选择 在许多情况下使用指针。事实上,标准库''聪明 诸如unique_ptr之类的指针本身就是这样的资源句柄 (§5.2.1)。我使用标准库矢量,因为我们没有 参数化具有元素类型的Vector,直到§3.4.1。
也许我的问题应该是:std::vector<thread> my_threads;
Vector init()
{
thread t {heartbeat}; // run heartbeat concurrently (on its own thread)
my_threads.push_back(move(t)); // move t into my_threads
Vector<double> vec;
// ... fill vec ...
return vec; // move res out of run()
}
auto v = init(); // start heartbeat and initialize v
和vector my_threads
在函数Vector vec
内的关系是什么?例如,当遇到类似下面的简单替代方案时,上述代码的优势是什么:
init()
答案 0 :(得分:0)
在
vector my_threads
内部Vector vec
和init()
之间的关系是什么?
两者都是您想要移动语义的插图。在第一种情况下,您无法将std::thread
复制到my_threads
(因为该类不可复制),但您可以移动它。在第二种情况下,可以复制一个巨大的向量,以便从函数中返回它,但你不会想要,因为移动效率更高。
面对更简单的替代
时,上述代码的优势是什么?
更简单的版本没有演示如何将对象移出函数,这是作者想要演示的内容。