이것은 내가 결코 알지 못하는 C++ 이론의 일부입니다. 중 하나포인터를 저장하고 값을 const로 전달
private:
QList<Node> nodes;
이제 클래스 A는 (CB라고도 함) 클래스 B의 인스턴스를 가지고 :
나는 그래서이 (크기) 작은 구조 클래스 A. 내부 노드라고하는 매우 큰 목록을 가지고 노드를 반복하고 그 노드를 읽는 데 필요한 함수 (어떤 식 으로든 정보를 수정하지는 않습니다).
function ClassB::readNodes(){
for (int i = 0; i < nodes.size(); i++){
// READ nodes and do stuff with that information
}
}
그래서 여기까지는 두 가지 방법으로이 문제를 해결할 수 있습니다. 이 클래스 BI 내부 나의 현재의 접근 방식이 있습니다 어딘가에 클래스 AI에 다음
public:
void setNodes(const QList *list) {nodes = list;}
private:
QList<Node> *nodes;
그리고 것은 수행
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
}
}
하지만이 성능 저하를 insume 것을 완전히 확실하지 않다. 내가 아는 바로는이 접근법은 노드를 참조로 취급하기 때문에 노드의 전체 복사본이 생성되지 않습니다. 이 올바른지?
성능 문제가되는 이유는 무엇입니까? 내부적으로 참조는 단순히 포인터입니다. 그리고 디자인은 매우 부러졌습니다. 클래스에는 데이터를 처리하고 부모 클래스 데이터에 액세스 할 수있는 객체가 포함되어 있습니까? 어쩌면 나는 오해를했습니다 ... 또한 STL이 이미 제공 한 기능에 대해 QAnyThing을 싫어합니다. QContainers는 내가 알고있는 것처럼 STL 컨테이너에 비해 아무런 이점이 없습니다 ... – Klaus
참조 또는 포인터는 중요하지 않으며 복사본이 만들어지지 않습니다. Qt가 [copy on write] (https://doc.qt.io/qt-5/implicit-sharing.html)를 사용했기 때문에 사본을 만들더라도 문제가되지 않습니다. – nwp
포인터는 메모리 오프셋의 정수 값입니다. 명시 적으로 수행 할 때까지 데이터를 복사 할 때 어떤 데이터도 복사하지 않습니다. – Sugar