c-style数组比std :: array和std :: vector更适合于固定大小的数据,这些数据有利于移动语义吗?

时间:2017-01-25 22:07:20

标签: c++ arrays c++11

我正在创建一个N维向量的新实现(我们称之为VectorND)来替换更大系统中的一些旧代码。 向量大小在编译时是已知的,因此c样式数组std::arraystd::vector都是VectorND类的基础数据结构的可行候选者。

我注意到向量传递了很多,并认为如果可以有效地移动新的VectorND类,系统将会受益匪浅。 (我意识到很多'传递'将无法使用移动,但是矢量也经常出现为右移)

std::vector类支持移动语义,因为c样式数组只是一个指针,它们都允许VectorND类中的移动构造函数/赋值运算符。然而std::array类需要移动O(n)时间,这对我来说听起来像这个“最明显的选择”实际上是最坏的情况。

对于剩下的两个,c样式数组可以作为单个内存块分配,因此确实使用了我们在编译时知道大小的事实。

我错过了什么或是c风格的数组确实是我VectorND类的最佳底层容器吗?

(听起来很奇怪,较新的stl类将是一个更糟糕的选择)

编辑:在再次阅读我的帖子后,我意识到std::unique_ptrstd::array可能会给我两全其美的好处?

1 个答案:

答案 0 :(得分:0)

我决定按照juanchopanza的建议去找std::vector。正如我在问题中已经提到的那样,它可以被移动(在O(1)中)并且正如juanchopanza指出的那样,开销非常小。

此外我喜欢它让我可以选择将移动操作声明为默认值,从而提高代码可读性。 (我想添加一个虚拟析构函数,所以我需要添加它们,因为编译器在指定析构函数时不会生成它们)

对于那些感兴趣的人,相关的声明:

/// Copy constructor
VectorND(const VectorND &) = default;
/// Move constructor
VectorND(VectorND &&) = default;
/// Copy assignment
VectorND& operator=(const VectorND &) = default;
/// Move assignment
VectorND& operator=(VectorND &&) = default;
/// Destructor
virtual ~VectorND() = default;