我在C ++中有一个像这样的结构:
struct MyStruct
{
someType v1;
someType2 v2;
someType3 v3;
someType4 f1();
std::vector<someType> myVector;
} ;
它经常用于这样的形式:
//some process... after which a std::vector<someType> vec1 is generated
MyStruct myStruct;
myStruct.myVector = vec1;
因为vec1相对较大。我想通过执行作业myStruct.myVector = vec1;
我应该在MyStruct中使用指向myVector的指针来加快速度吗?如何?
答案 0 :(得分:11)
因为vec1相对较大。我想通过分配来了解它是否花费了很多时间
它花费的时间与矢量的大小成线性比例。
我应该在MyStruct中使用指向vec的指针来加快速度吗?
鉴于您所描述的问题,除非您遗漏了相关细节,否则我不会建议您使用指针。
您可以移动分配向量(自C ++ 11以来),或交换它(在C ++ 11之前)。但是,假设你不需要vec1
来做任何事情。
答案 1 :(得分:2)
std::vector<someType> myVector
和std::vector<someType*> myVector
之间存在根本区别。非指针版本实际拥有并存储数据。这意味着一旦完成赋值,对原始变量的更改将不会导致向量的更改(深层复制)。
在指针版本中,存储位于向量的外部。这意味着对原始文件的更改将导致向量更改(浅副本)。这也是另一种效应。
由于存储位于矢量的外部,因此您有责任确保原始数据的存储时间长于矢量。否则会发生坏事。这可以通过std::shared_ptr
来缓解,但您仍然会使相同的内存别名。
所以你需要问的问题是你需要浅拷贝还是深拷贝。
如果数据存储在std::move
外部(如stl-container),struct
只会保存副本,否则您需要移动std::unique_ptr<someType>
以保存副本