C++ C++;可以从类中设置的只读结构?
我有一个类C++ C++;可以从类中设置的只读结构?,c++,performance,struct,qvector,C++,Performance,Struct,Qvector,我有一个类Foo,它在其中定义了一个公共结构Data,其中QVector allData嵌套了Data结构的多个对象: class Foo { public: struct Data { uchar valueA; uchar valueB; uchar valueC; }; private: QVector<Data> allData; }; 将
Foo
,它在其中定义了一个公共结构Data
,其中QVector allData
嵌套了Data
结构的多个对象:
class Foo
{
public:
struct Data {
uchar valueA;
uchar valueB;
uchar valueC;
};
private:
QVector<Data> allData;
};
将导致每次调用此方法时都创建一个新对象
如果我给其他类一个类似于QVector allDataCopy
的东西,它刚刚被交给Foo
来填充allData
中的值,那只会导致每次都要复制所有值,我想这也不是很好
有什么有效的方法可以解决这个问题吗?除非您想强制用户复制,否则您的“getter”不应该按值返回。提供两个重载,分别返回左值引用和const
左值引用(如果您不希望Foo
的用户变异allData
,则仅返回const
一个):
这允许用户方便地将
所有数据
从类型为Foo
QVector
的右值移动,复制成本低;它在写语义上使用智能引用复制
如果代码有多线程访问的危险,QVector const&
是危险的,因为引用不是线程安全的。如果您是可重入的,并且当其他人抓住QVector常量&
时,会导致修改QVector
,同样的危险也会发生
只需返回一份
QVector
。涉及引用的花俏替代品可能会导致潜在的bug,除非有证据表明“复制”代码< QVector >代码>造成性能问题的小成本,否则不要考虑这些错误。 <代码> QVector <代码>是。也就是说,您可以将其设置为const QVector&getAllData()
您可以通过const引用返回,因为该值是一个成员变量,但我不确定这是否安全。“每秒多次”:请给出我们正在讨论的“mutliple”的顺序。单位?经皮电刺激神经疗法?几百?百万?你为什么用QVector而不是std::vector?@manni66:我想这可能是一个问题本身的基础。事实证明,总的来说,这是个好建议。尽管我想添加隐式共享的QVector
。复制构造函数始终为常量时间,相反,当任何引用写入共享instance.QVector时,将复制元素。但是有一个移动成员变量的getter似乎是个糟糕的主意。我错了吗?@FredLarson注意到,特定的getter是用&&&
限定的引用,这意味着只有当您从右值调用它时,它才会参与。例如,std::move(foo).getAllData()
会移出allData
,但foo.getAllData()
不会。@FrançoisAndrieux:谢谢。我还不习惯这些限定词。OP不希望第一个过载,第二个就足够了。
QVector<Data> getAllData() {
return allData;
}
QVector<Data>& getAllData() {
return allData;
}
const QVector<Data>& getAllData() const {
return allData;
}
QVector<Data>& getAllData() & { return allData; }
const QVector<Data>& getAllData() const& { return allData; }
QVector<Data> getAllData() && { return std::move(allData); }