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); }