2011-07-28 2 views
11

내가 일하고있는 수업에서 나는 몇 가지 QList을 저글링하고있다. 나는 Qt가 가능할 때마다리스트의 깊은 복사본을 만들지 않으려한다고 들었습니다. 어떤 경우에는딥 복사는 언제 QList에 발생합니까?

QList<int> myList; 
myList << 1 << 2 << 3 << 4; 
QList<int> otherList = myList; // No deep copy 

, 나는 확실히 딥 카피는 결코 QList에 발생 없는지 확인해야합니다 내가 이해에서, 그것은 더 깊은 복사본이 작업을 수행 할 때 발생 없음을 의미한다. 정확히 어떤 종류의 작업이나 작업을 수행해야합니까? QList에 깊은 사본이 절대 생성되지 않도록해야합니다.

답변

13

QLists는 implicit sharing을 사용하여 구현됩니다.

암시 적으로 공유 된 개체에 대한 개체 할당 (연산자 =())은 얕은 복사본을 사용하여 구현 된 입니다.

즉, 할당만으로는 포함 된 데이터가 복사되지 않습니다. 그러나 공유 인스턴스 에 쓰면이되므로 원본 개체가 복사됩니다. 이 패턴은 일반적으로 copy-on-write로 알려져 있습니다.

질문에 대답하기 위해 공유 인스턴스에 쓰지 않는다면 결코 복사되지 않습니다. 복사를 완전히 막으려면 QList에서 파생되고 복사 생성자와 대입 연산자를 무시하고 숨 깁니다.

2

QList를 함수의 인수로 전달하거나 수정하지 않고 복사본을 만들 때 Qt는 "래퍼"를 전달하기 만하면 실제 데이터는 복사되지 않습니다. 암시 적 공유는 Flyweight 패턴의 Qt 구현입니다 (here 참조).

1

그냥 constBegin(), constEnd(), 패스 const 참조를 사용하여 수정하거나 복사하지 마십시오.

관련 문제