我在他的新书TCPL第4版的第3.3.3节中理解Stroustrup先生片段有些困难

时间:2013-07-26 14:29:55

标签: c++ c++11

我在理解作者试图在他的新书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()

1 个答案:

答案 0 :(得分:0)

  

vector my_threads内部Vector vecinit()之间的关系是什么?

两者都是您想要移动语义的插图。在第一种情况下,您无法将std::thread复制到my_threads(因为该类不可复制),但您可以移动它。在第二种情况下,可以复制一个巨大的向量,以便从函数中返回它,但你不会想要,因为移动效率更高。

  

面对更简单的替代

时,上述代码的优势是什么?

更简单的版本没有演示如何将对象移出函数,这是作者想要演示的内容。