我在理解作者在3.3.3 Resource Management
他的新书部分中试图传达的内容时遇到了问题The C++ Programming Language 4th edition
。我从作者的主页复制了以下提到的部分:
3.3.3 资源管理[tour2.copy.resource]
通过定义构造函数、复制操作、移动操作和析构函数,程序员可以完全控制包含的资源(例如容器的元素)的生命周期。特别是,移动构造函数允许对象简单而廉价地从一个作用域移动到另一个作用域。这样,我们可以将我们不能或不想复制的对象移出范围。考虑一个代表并发活动(§5.3.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 和 thread)在许多情况下可以替代使用指针。事实上,诸如 unique_ptr 之类的标准库“智能指针”本身就是此类资源句柄(第 5.2.1 节)。我使用了标准库向量,因为直到第 3.4.1 节我们才能使用元素类型参数化向量。
vector my_threads
也许我的问题应该是:函数和Vector vec
内部函数之间有什么关系init()
?例如,当遇到像下面这样的更简单的替代方案时,上面的代码有什么优势:
std::vector<thread> my_threads;
thread t(hearbeat);
my_threads.push_back(move(t));
Vector<double> vec;
// ... fill vec ...