0

我在理解作者在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 ...
4

1 回答 1

0

vector my_threadsVector vec内部函数有什么关系init()

两者都说明了何时需要移动语义。在第一种情况下,您不能将 a 复制std::threadmy_threads(因为该类不可复制),但您可以移动它。在第二种情况下,您可以复制一个巨大的向量以便从函数中返回它,但您不希望这样做,因为移动效率更高。

当遇到更简单的替代方案时,上面的代码有什么优势

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

于 2013-07-26T15:02:29.777 回答