【发布时间】:2017-03-08 07:37:07
【问题描述】:
我有一个大型数据集(数 GB)存储在一个不适合 QVector(最大 ~2gb)的文件中,该文件是写时复制的,不会受此影响。我像这样将向量加载到内存中:
std::vector<int> load()
{
std::vector<int> vec;
QFile file("filename");
file.open(QIODevice::ReadOnly);
QDataStream stream(&file);
stream >> vec; //using my implementation of QDataStream &operator>>(QDataStream &stream, std::vector<int> &v)
return vec;
}
并将其传递给这个:
class Data
{
public:
Data(const std::vector<int> &data) :
d(data)
{
}
private:
std::vector<int> d;
};
这样:
Data data(load());
现在在load() 中创建了向量并用文件中的数据填充。然后它按值返回,但我认为编译器应该对其进行优化,而不是实际复制vec,而是将其移动到目的地。
目标是Data 的私有成员,但我怀疑构造函数中的初始化列表实际上可能会复制向量而不是移动它,因为它不知道(或者是吗?)它已收到一个 const 引用临时的。
有没有办法保证在这种场景下向量只会在构造后移动而不被复制?我怀疑使用std::move、std::forward 或更改Data::Data() 的签名来获取r 值参考?
【问题讨论】:
-
既然您已经开始怀疑所有这些事情,那么是什么阻止您尝试它们?
-
@KerrekSB 事实上,我不会只使用一个编译器,我宁愿知道什么会起作用,而不是在所有因优化和诸如此类而绊倒的人身上尝试它。 .
-
已经有一个更好的答案,但请注意,让 shared_ptr(或 unique_ptr,如果你可以管理)拥有向量将是避免复制的一种相当简单的方法。