2011-01-09 2 views
12

저는 C++로 게임 엔진 라이브러리를 구축하고 있습니다. 잠시 뒤로 Qt를 사용하여 응용 프로그램을 작성했으며 Implicit Sharing이라는 사용에 매료되었습니다. 아무도이 기술을 더 자세히 설명 할 수 있는지 또는이 작업의 간단한 예를 제공 할 수 있는지 궁금합니다.암시 적 공유 란 무엇입니까?

+5

어떻게 작동하는지에 대한 훌륭한 설명을 제공 한 문서에 대한 링크를 제공했습니다. 그것은 심지어 참조를 [원자 참조 카운팅 멀티 스레드 응용 프로그램에서 도움이되는 방법을 설명하는 스레드 문서] (http://doc.trolltech.com/latest/threads-modules.html#threads-and-implicitly-shared-classes). 여전히 명확하지 않은 부분이 있으면 그 것에 대해보다 자세한 질문을해야합니다. 그리고 항상 Qt 소스를 볼 수 있다는 것을 잊지 마십시오. –

+0

* 암시 적 공유 *에 대한 다른 이름은 * copy-on-write *입니다. 당신은이 다른 이름을 언급 한 질문을 보길 원할 것입니다. 예를 들면 다음과 같습니다 : http://stackoverflow.com/questions/628938/what-is-copy-on-write –

+0

나는 암묵적 공유가 단지 Qt 's [copy-on-write] (https://en.wikipedia.org/wiki/Copy-on-write) 구현. – HelloGoodbye

답변

31

암시 적 공유 뒤에있는 핵심 개념은보다 일반적인 용어 copy-on-write을 사용하는 것으로 보입니다. copy-on-write의 배경은 각 객체를 실제 구현에 대한 포인터를 감싸는 래퍼로 사용하는 것입니다. 각 구현 객체는 포인터의 수를 추적합니다. 래퍼 객체에서 작업이 수행 될 때마다 실제 객체를 구현하는 객체로 전달됩니다. 이는 실제 작업을 수행합니다.

이 방법의 장점은 이러한 개체를 복사하고 파괴하는 것이 저렴하다는 것입니다. 객체의 복사본을 만들려면 래퍼의 새 인스턴스를 만들고 포인터를 구현 객체를 가리 키도록 설정 한 다음 객체에 대한 포인터 수의 카운트를 증가시킵니다 (이는 종종 참조 카운트라고 함).). 파괴는 유사합니다. 우리는 참조 카운트를 하나 씩 내린 다음 다른 누군가가 구현을 가리키고 있는지 확인합니다. 그렇지 않다면 우리는 자원을 무료로 제공합니다. 그렇지 않으면 아무 것도하지 않고 나중에 다른 사람이 정리를 수행한다고 가정합니다.

이 접근법의 과제는 여러 개의 서로 다른 개체가 모두 동일한 구현을 가리키고 있다는 것입니다. 즉, 누군가가 구현 변경을 끝내면 해당 구현을 참조하는 모든 객체가 변경 사항을 보게된다는 것을 의미합니다. 이는 매우 심각한 문제입니다. 이 문제를 해결하기 위해 구현이 변경 될 가능성이있는 작업이 수행 될 때마다 연산은 참조 카운트가 동일한지를 확인하여 다른 객체가 구현을 참조하는지 확인합니다. 다른 객체가 객체를 참조하지 않으면 작업을 바로 진행할 수 있습니다. 변경 사항이 전파 될 가능성은 없습니다. 데이터를 참조하는 다른 하나 이상의 객체가있는 경우 래퍼는 먼저 자체에 대한 구현의 deep-copy를 만들고 포인터가 새 객체를 가리 키도록 변경합니다. 이제는 공유 할 수 없다는 것을 알고 있으며 번거 로움없이 변경할 수 있습니다.

실례가되는 예제를 보려면 강의 예 15.0과 16.0을 Stanford's introductory C++ programming course에서 살펴보십시오. 이 기법을 사용하여 단어 목록을 보유 할 객체를 설계하는 방법을 보여줍니다.

희망이 도움이됩니다.