移动语义在矢量重定位中的工作原理
How move semantic works in vector relocation?
根据我的理解,当vector增加其容量时,它会分配一个新的内存,将所有内容复制(移动?)到新数组中,然后销毁旧数组:
vector<int> v;
v.emplace_back(1);
v.emplace_back(2); cout<<&v[0]<<endl; // outputs 0x4b16d0
v.emplace_back(3); cout<<&v[0]<<endl; // outputs 0x4b16f0
+-----+
0x4b16d0 | 1 2 |
+-----+
+---------+
0x4b16f0 | 1 2 3 |
+---------+
在上面的例子中,1和2 move
如何从0x4b16d0
到0x4b16f0
?
更新为用户定义的类
struct foo {
foo() {}
foo(const foo &) { cout << "copyn"; }
foo(foo &&) noexcept { cout << "moven"; }
};
int main() {
vector<foo> v;
cout<<"1st emplace_back() n"; v.emplace_back(); cout<<" addr of 1st element: "<<&v[0]<<endl;
cout<<"2nd emplace_back() n"; v.emplace_back(); cout<<" addr of 1st element: "<<&v[0]<<endl;
}
$ g++ -std=c++11 -g a.cpp; ./a.exe
1st emplace_back()
addr of 1st element: 0x6f16d1
2nd emplace_back()
move
addr of 1st element: 0x6f16f1
我的问题是,即使调用move
因子,它仍然将数据从一个地方复制到另一个地方,是这样吗?
如果是这样,这是否意味着当vector使用move语义增加其容量时,它根本没有提高性能?
您的矢量是vector<int>
。移动int
和复制它是一样的,所以这里没有"性能增益"。
如果你有vector<std::string>
,那么你会注意到差异;大字符串将从旧的内存位置移动到新的内存位置。这比在新位置复制构造新字符串并销毁旧字符串要快。
(正如Chris Beck所指出的,对象只有在它们的move-构造函数不能抛出时才会被移动,但我相信std::string
就是这种情况)。
我不确定你想在你的foo
的例子中测试什么,因为你的foo
实际上不包含任何数据。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 移动语义在矢量重定位中的工作原理