可以在类中设置的C ++只读结构吗?

时间:2018-01-18 15:25:21

标签: c++ performance struct qvector

我有一个类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内的值,这只会导致必须复制每次所有的价值观,我认为这些价值观也不会很好。

有没有有效的方法来解决这个问题?

2 个答案:

答案 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的小成本导致性能问题之前不要考虑它们。