假设我有以下代码:
#include <vector>
struct A {
int a;
int x;
};
int main() {
using namespace std;
A a1;
A a2;
vector<A> va;
va.push_back(a1);
va.push_back(move(a2));
}
Run Code Online (Sandbox Code Playgroud)
我知道std :: vector的元素是连续存储的,与std :: list不同.在上面的代码a2
被移动但是真的没有复制a2
到向量va
?va.push_back(a2);
和之间有什么区别va.push_back(move(a2));
?
cdh*_*wie 42
在您的情况下,没有有效的区别,因为您使用的是编译器提供的复制构造函数.当使用可移动构造的对象时,您会看到明显的性能差异,并且需要花费很多精力来复制.在这种情况下,使用push_back(x)
会创建对象的副本,同时push_back(move(x))
会告诉push_back()
它可能"窃取"内容x
,留x
在不可用和未定义的状态.
考虑一下你是否有一个list(std::vector<std::list<int> >
)向量,你想推送一个包含100,000个元素的列表.如果没有move()
,将复制整个列表结构和所有100,000个元素.随着move()
,一些指针和其他一小部分数据被混乱,这就是它.这将更快,并且将需要更少的总体内存消耗.
For*_*veR 17
当你使用va.push_back(a2)
版本时vector<T>::push_back(const T&)
会调用,当你使用va.push_back(move(a2))
版本时vector<T>::push_back(T&&)
会被调用...
但是在你的情况下,性能没有差别,因为
15非联合类X的隐式定义的复制/移动构造函数执行其基础和成员的成员复制/移动.
第12.8段3337年草案.
归档时间: |
|
查看次数: |
32804 次 |
最近记录: |