<分区>
#include <vector>
#include <iostream>
#include <iterator>
using namespace std;
class MoveableClass
{
public:
MoveableClass() {
cout << "Default constructor" << endl;
}
MoveableClass(const MoveableClass& src) {
cout << "Copy constructor" << endl;
}
MoveableClass(MoveableClass&& src) {
cout << "Move constructor" << endl;
}
MoveableClass& operator=(const MoveableClass& rhs) {
cout << "Copy assignment operator" << endl;
return *this;
}
MoveableClass& operator=(MoveableClass&& rhs) {
cout << "Move assignment operator" << endl;
return *this;
}
};
int main()
{
vector<MoveableClass> vecSource(3);
cout << "----" << endl;
MoveableClass mc;
cout << "----" << endl;
vecSource.push_back(mc);
// vecSource.push_back(mc);
// vecSource.push_back(mc);
// vecSource.push_back(mc);
cout << "----" << endl;
// Copy the elements from vecSource to vecOne
vector<MoveableClass> vecOne(vecSource.begin(), vecSource.end());
cout << "----" << endl;
// Move the elements from vecSource to vecTwo
vector<MoveableClass> vecTwo(make_move_iterator(vecSource.begin()),
make_move_iterator(vecSource.end()));
cout << "----" << endl;
return 0;
}
从上面的代码我有2个疑惑:
当我使用 2 个 push_back(mc) 函数时,为什么没有从已实现的类中调用 move ctor 复制 ctor 的调用是 3 次,即第一次推送 1 次,第二次推送第一个 vector 被调整大小(随后增长)到不同的内存位置(第一次推送应该触发移动)第二次推送第三次
即使我用大小 3 初始化 vector 对象,为什么对复制 ctor 的调用增加到 4 个 push_back(mc)。
输出:
Default constructor
Default constructor
Default constructor
----
Default constructor
----
Copy constructor
Copy constructor
Copy constructor
Copy constructor
----
Copy constructor
Copy constructor
Copy constructor
Copy constructor
----
Move constructor
Move constructor
Move constructor
Move constructor
----
我使用的 gcc 版本是:
> gcc version 4.7.3
更新
感谢您的回复,我正在做某事
对于我的 1) 点我想补充
// MoveableClass(const MoveableClass& src) {
// cout << "Copy constructor" << endl;
// }
MoveableClass(MoveableClass&& src) noexcept {
cout << "Move constructor" << endl;
}
....
void fun() {
cout << "hello\n";
}
int main()
{
vector<MoveableClass> vecSource(3);
// vector<MoveableClass>::iterator it;
// vecSource.reserve(3);
cout << "----" << endl;
MoveableClass mc;
cout << "----" << endl;
mc.fun();
vecSource.push_back(mc);
// vecSource.push_back(move(mc));
// vecSource.push_back(move_if_noexcept(mc));
// vecSource.push_back(mc);
// vecSource.push_back(mc);
// vecSource.push_back(mc);
// for(it = vecSource.begin(); it != vecSource.end(); ++it )
// cout << (*it).fun() << endl;
cout << "----" << endl;
// Copy the elements from vecSource to vecOne
vector<MoveableClass> vecOne(vecSource.begin(), vecSource.end());
cout << "----" << endl;
// Move the elements from vecSource to vecTwo
vector<MoveableClass> vecTwo(make_move_iterator(vecSource.begin()),
make_move_iterator(vecSource.end()));
cout << "----" << endl;
return 0;
}
我已经编辑了上面的代码
// vecSource.push_back(move(mc)); I can call move ctor only
// vecSource.push_back(move_if_noexcept(mc)); I can call move ctor only
understood..
如果我评论复制构造函数我得到编译错误
knils@knils-HP:IteratorAdapters$ g++ -g -std=c++0x MoveIterators.cpp
Internal compiler error: Error reporting routines re-entered.
Please submit a full bug report, with preprocessed source if appropriate.
See for instructions. Preprocessed source stored into /tmp/ccHhV599.out file, please attach this to your bugreport.
为什么它给出这个错误,为什么它不使用它的默认复制构造函数
对于 2) 点,当我为大小 3 初始化时,这是否意味着 3 个内存位置是用类实例初始化的?
for(it = vecSource.begin(); it != vecSource.end(); ++it )
cout << (*it).fun() << endl;
我无法使用上面的代码它给出了错误
MoveIterators.cpp:48:30: note: mismatched types ‘const _CharT*’ and ‘void’
补充一下,我认为这里存在调整保留大小的差异,其中保留不调用默认 ctor 并使内存未初始化。
我认为最好在我们需要的范围内为 vector 保留一些空间,而不是避免定期内存交换。即使超过它也会到新的位置。
更新
代码修改
vector<MoveableClass> vecSource;
vecSource.push_back(mc);
vecSource.push_back(mc);
我得到的o/p是
拷贝构造函数 复制构造函数 移动构造函数
我对这里的顺序感到困惑。 我很期待 复制构造函数 移动构造函数 拷贝构造函数
因为第一次推送它初始化一个大小(复制)第二次它重新分配,所以将现有内存移动到新位置(移动)并复制第二次推送到新位置(复制) 编译器不同为什么..
问候!