我有一个类Foo
,它在其中定义了一个公共结构Data
,其中QVector<Data> allData
嵌套了Data
结构的多个对象:< / p>
class Foo
{
public:
struct Data {
uchar valueA;
uchar valueB;
uchar valueC;
};
private:
QVector<Data> allData;
};
我还有另外两个B和C类需要每秒多次读取allData
。他们根本无法写入allData
,这只能由Foo
班级处理。
考虑到性能,我正在寻找一种方法来做到这一点,而不是每次都创建一个新的QVector。据我了解,这样的方法:
QVector<Data> getAllData() {
return allData;
}
每次调用此方法时,都会导致创建一个新对象。
如果我将其他类似于QVector<Data> allDataCopy
的内容移交给Foo
,以填充allData
内的值,这只会导致必须复制每次所有的价值观,我认为这些价值观也不会很好。
有没有有效的方法来解决这个问题?
答案 0 :(得分:4)
除非您想强制复制用户,否则您的“getters”不应按值返回。提供两个重载,分别返回左值引用和 const
左值引用(如果不需要用户,则只返回const
个引号Foo
改变allData
):
QVector<Data>& getAllData() {
return allData;
}
const QVector<Data>& getAllData() const {
return allData;
}
这仍然允许您的用户制作副本(如果需要),但也允许您的用户通过引用观察/变异allData
,而无需任何副本。
在C ++ 11及更高版本中,如果QVector
支持移动语义,您可能也希望在&&
ref限定符上重载:
QVector<Data>& getAllData() & { return allData; }
const QVector<Data>& getAllData() const& { return allData; }
QVector<Data> getAllData() && { return std::move(allData); }
这样,用户可以方便地从allData
类型的左值移动Foo
。
答案 1 :(得分:3)
QVector
复制起来很便宜;它在写语义上使用智能引用副本。
如果您的代码存在多线程访问的危险,QVector const&
是危险的,因为引用不是线程安全的。如果您是可重入的,可能会发生同样的危险,并导致QVector
在其他人抓住QVector const&
时被修改。
只需返回QVector
的副本即可。涉及引用的花哨替代方案可能会导致潜在的错误,在您有证据表明“复制”QVector
的小成本导致性能问题之前不要考虑它们。