这是我从未得到的c ++理论。
我有一个非常大的小结构列表(大小),在A类中称为节点。 所以我有:
private:
QList<Node> nodes;
现在,A类具有B类实例(称为cB),并且对于其中一个函数,它需要迭代节点并只读取它们(它不会以任何方式修改信息)。
function ClassB::readNodes(){
for (int i = 0; i < nodes.size(); i++){
// READ nodes and do stuff with that information
}
}
据我所知,有两种方法可以解决这个问题。这是我目前的方法内部B类我有:
public:
void setNodes(const QList *list) {nodes = list;}
private:
QList<Node> *nodes;
然后在A类的某个地方我做:
cb.setNodes(&nodes);
这种方法的目的是我希望每次调用readNodes()
时都避免复制非常大的数据结构,并且内存中只有一个数据结构副本。这很重要,因为A类将不断更改节点。
在我看来,第二种方法更简单,更清晰。只需将readNodes
定义为:
function ClassB::readNodes(const QList<Node> &nodes){
for (int i = 0; i < nodes.size(); i++){
// READ nodes and do stuff with that information
}
}
但我并不完全确定这会导致性能下降。据我所知,这种方法也将节点视为参考,因此不会出现节点的深层副本。这是对的吗?
答案 0 :(得分:2)
大多数Qt类(包括容器类)都是implicitly shared。因此,即使您按价值传递它们,在访问这些项目之前也不会有深层复制。 传递对象的const引用是一种更通用和安全的方法。