2017-05-04 1 views
0

이것은 내가 결코 알지 못하는 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 것을 완전히 확실하지 않다. 내가 아는 바로는이 접근법은 노드를 참조로 취급하기 때문에 노드의 전체 복사본이 생성되지 않습니다. 이 올바른지?

+0

성능 문제가되는 이유는 무엇입니까? 내부적으로 참조는 단순히 포인터입니다. 그리고 디자인은 매우 부러졌습니다. 클래스에는 데이터를 처리하고 부모 클래스 데이터에 액세스 할 수있는 객체가 포함되어 있습니까? 어쩌면 나는 오해를했습니다 ... 또한 STL이 이미 제공 한 기능에 대해 QAnyThing을 싫어합니다. QContainers는 내가 알고있는 것처럼 STL 컨테이너에 비해 아무런 이점이 없습니다 ... – Klaus

+0

참조 또는 포인터는 중요하지 않으며 복사본이 만들어지지 않습니다. Qt가 [copy on write] (https://doc.qt.io/qt-5/implicit-sharing.html)를 사용했기 때문에 사본을 만들더라도 문제가되지 않습니다. – nwp

+0

포인터는 메모리 오프셋의 정수 값입니다. 명시 적으로 수행 할 때까지 데이터를 복사 할 때 어떤 데이터도 복사하지 않습니다. – Sugar

답변

2

대부분의 Qt 클래스 (컨테이너 클래스 포함)는 implicitly shared입니다. 따라서 값으로 전달하더라도 해당 항목에 액세스 할 때까지 전체 복사본이 없습니다. 개체의 const 참조를 전달하는 것이 더 일반적이며 안전한 방법입니다.

+0

두 번째 클래스를 제안하고 있습니다. 권리? – aarelovich

+0

@aarelovich : 아니요! 대답은 당신이 객체를 제공 할 수 있으며 레퍼런스는 제공 할 수 없다는 것을 알려주며 여전히 copy on write를 통해 이익을 얻습니다. 참조를 제공하면 참조가 기술적으로 포인터이기 때문에 어떤 (깊은) 사본도 필요하지 않습니다. 그러니주의 깊게 읽으십시오! 이 답변은 이미 귀하의 질문에 대한 의견에 주어졌습니다! 그래서 참조가 무엇인지 이해하십시오! – Klaus

+0

@aarelovich 두 번째 옵션을 사용하면 포인터의 크기를 초과하여 복사하지 않아도됩니다. – sithereal

관련 문제