gpt4 book ai didi

c++ - move 语义可以帮助构建在 std::array 上的用户定义容器吗?

转载 作者:行者123 更新时间:2023-11-28 03:25:27 25 4
gpt4 key购买 nike

当在 std::array

上定义新容器时,请考虑以下代码
#include <iostream>
#include <array>
#include <initializer_list>

// My container
template<typename Type, unsigned int Size>
class MyContainer
{
// Lifecycle
public:
MyContainer() : _data() {}
MyContainer(const MyContainer<Type, Size>& rhs) : _data(rhs.data()) {}
MyContainer(const std::array<Type, Size>& rhs) : _data(rhs) {}
template<typename... Types> MyContainer(const Types&... numbers) : _data({{numbers...}}) {}
~MyContainer() {}

// Assignment
public:
MyContainer<Type, Size>& operator=(const MyContainer<Type, Size>& rhs) {_data = rhs.data(); return *this}

// Accessors
public:
Type& operator[](const unsigned int i) {return _data[i];}
const Type& operator[](const unsigned int i) const {return _data[i];}
std::array<Type, Size>& data() {return _data;}
const std::array<Type, Size>& data() const {return _data;}

// Operators
public:
MyContainer<Type, Size> operator+(const MyContainer<Type, Size>& rhs)
{
MyContainer<Type, Size> result;
for (unsigned int i = 0; i < Size; ++i) {
result[i] = _data[i] + rhs[i];
}
return result;
}

// Data members
protected:
std::array<Type, Size> _data;
};

// Main
int main(int argc, char* argv[])
{
// Initialization
MyContainer<double, 4> x = {0., 1., 2., 3.};
MyContainer<double, 4> y = {4., 5., 6., 7.};
MyContainer<double, 4> z;

// Operation
z = x+y; // Can move semantics help here ?

// Result
std::cout<<z[0]<<" "<<z[1]<<" "<<z[2]<<" "<<z[3]<<std::endl;
return 0;
}

move 语义能否通过避免某些拷贝来加快 main() 中的操作?

如果是,在目前的设计中如何实现?

最佳答案

没有。 std::array<double, N>的所有数据包含在对象本身中。 move 语义仅在对象拥有外部引用资源(通常通过指针)时有用,并且该引用可以被复制和取消。

关于c++ - move 语义可以帮助构建在 std::array 上的用户定义容器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14167623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com