移动单个矢量元素上的语义
Move semantics on individual vector elements
单个向量元素上std::move
的行为是什么?例如(大致简化的代码如下(
这会执行正确的移动吗,我需要erase()
移动的元素吗?
和删除,编译器是否会针对移动(合成(进行优化,而不是在某些情况下使用复制构造函数?
我尝试使用智能指针包装器,但没有看到显着的加速。移动语义看起来像我想要使用的。
template< class T >
class Foo
{
};
vector< Foo< T > > v1, v2;
v2.emplace_back( std::move( v1[ 2 ] );
我没有看到使用移动操作的显着加速,我认为我已经正确实现了移动构造函数和移动赋值运算符。
请阐明这个问题。
移动语义有两个工作:
- 指示资源的所有权(例如某些分配的内存、FILE* 指针或流(已易手
- 在上述情况下避免不必要的副本。
例如,假设我们有一个向量:
vector<int> a;
for(int i = 0; i < 10000; i++) {
a.push_back(i);
}
如果我写:
vector<int> b = a;
这会复制a
中的每个元素,因此操作速度很慢。但是,如果我写
vector<int> b = std::move(a);
a
中的任何元素都不会被复制,这最终会快得多。但是,a
不再拥有这些元素。我们可以使用以下代码进行演示:
#include <vector>
#include <iostream>
int main() {
using std::vector;
vector<int> a = {1, 2, 3};
vector<int> b = std::move(a);
if(a.data() == nullptr) // This should be true now
std::cout << "a.data() is null nown";
if(a.size() == 0)
std::cout << "a.size() is zero nown";
}
在我的系统上,使用 gcc 和 clang 打印此代码
a.data() is null now
a.size() is zero now
即使您有一个包装类,这也适用:
#include <vector>
#include <iostream>
template<class T>
class Wrapper {
public:
// Because all the members of Wrapper are public,
// the compiler automatically generates move and copy constructors
T value;
};
int main() {
using std::vector;
Wrapper<vector<int>> a = {{1, 2, 3}};
Wrapper<vector<int>> b = std::move(a);
// Same output as before
if(a.value.data() == nullptr)
std::cout << "a.data() is null nown";
if(a.value.size() == 0)
std::cout << "a.size() is zero nown";
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 使用strcpy将char数组的元素复制到另一个数组
- 使用不带参数的函数访问结构元素
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- C++如何通过用户输入删除列表元素
- 何时在引用或唯一指针上使用移动语义
- lower_bound()返回最后一个元素
- 基于多个条件处理地图中的所有元素
- 调整大小后指向元素值的指针unordered_map有效?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 使用函数"remove"删除重复元素
- 具有最大子序列大小的序列,每个元素都相同
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将元素添加到数组的线程安全函数?
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- boost multi_index - 如果元素类型仅支持移动语义,如何遍历它?
- 移动单个矢量元素上的语义
- 如何在语义操作中访问元组的元素
- 首先创建字符串,然后通过移动语义将其添加到 vector 或在 vector 中创建元素是否具有内存效率