【发布时间】:2014-12-30 15:44:22
【问题描述】:
我试图更好地理解将元素插入 STL 容器时移动的工作原理。我正在查看使用 new(在堆上创建)分配对象的代码。稍后,当插入完成时,STL 容器似乎分配了一个新对象并调用了移动构造函数。有没有办法让STL容器直接使用对象(接管被分配的对象(ptr))。
我有以下示例代码可以解决一些其他问题:
#include <iostream>
#include <vector>
using namespace std;
class foo
{
public:
string s1;
foo() = default;
foo(const foo& fm)
{ cout << "copy ctor" << endl; }
foo(const foo&& fm)
{ cout << "move ctor" << endl; }
foo& operator= (const foo& fm)
{ cout << "copy assign" << endl; return *this; }
};
vector<foo> vec_f;
int main()
{
foo f1;
vec_f.push_back(f1);
cout << endl;
foo f2;
vec_f.push_back(move(f2));
cout << endl;
foo *f3 = new (foo);
vec_f.push_back(*f3);
cout << endl;
foo *f4 = new (foo);
vec_f.push_back(move(*f4));
cout << endl;
}
输出如下:
copy ctor
move ctor
copy ctor
copy ctor
copy ctor
copy ctor
move ctor
f1 : foo 是使用复制 ctor 创建的。但是,这个对象是否是由于 STL 代码执行新的 OR 部分将对象按值传递给函数(与 STL 无关,而是编译器的事情)而创建的?我猜是后者。如果是这样,当元素插入容器时,对象创建在哪里?
f2 : foo 是由 STL 代码使用 move ctor 创建的,对吗?为什么/如何在之后立即调用复制 ctor?是因为 f2 是在堆栈(而不是堆)上创建的吗?如果是这样,STL 代码是如何计算出来的?
f3 : 最让我费解的。猜测第一个复制 ctor 是作为按值传递参数的一部分调用的(与 STL 无关)。如何/为什么调用其他两个复制 ctor。
f4 : STL 调用 move ctor,因此 move ctor 可以使用 foo 对象的胆量。是否可以让 STL 代码只使用 ptr(因为它是在堆上创建的)。我的理解是 STL 容器中的对象无论如何都是在堆上创建的。
抱歉,帖子太长了。希望有人能解释一下。
问候, 艾哈迈德。
【问题讨论】:
-
删除了您告诉我们忽略的所有位。下次请自己做。