COW (Copy-On-Write)의 장점은 무엇입니까? 당연히 개인적 견해는 기대하지 않지만 실제적이고 실용적인 시나리오는 기술적으로나 실질적으로 유익 할 수 있습니다. 그리고 유형의 의미는 &
문자 입력을 절약하는 것 이상을 의미 합니다.
명확히하기 위해이 질문은 할당 또는 복사본 구성이 암시 적 얕은 복사본을 만드는 데이터 유형의 컨텍스트에 있지만 수정하면 암시 적 깊은 복사본이 만들어지고 원본 개체 대신 변경 사항이 적용됩니다.
내가 묻는 이유는 COW를 기본 암시 적 동작으로 갖는 장점을 찾지 못하는 것 같습니다. 많은 데이터 유형에 대해 COW를 구현 한 Qt를 사용합니다. 실제적으로 모든 기본 동적 할당 스토리지가 있습니다. 그러나 실제로 사용자에게 어떤 이점이 있습니까?
예를 들면 :
QString s("some text");
QString s1 = s; // now both s and s1 internally use the same resource
qDebug() << s1; // const operation, nothing changes
s1[o] = z; // s1 "detaches" from s, allocates new storage and modifies first character
// s is still "some text"
이 예에서 COW를 사용하면 무엇을 얻을 수 있습니까?
const 연산을 s1
사용하는 것만으로도 여분의 것만 사용할 수 있습니다 s
.
값을 변경하려는 경우 COW는 암시 적 공유 및 공유 스토리지에서 분리하기위한 참조 횟수를 증가시키는 (최소한이지만) 비용으로 첫 번째 비정상 작업까지 자원 복사 만 지연시킵니다. COW와 관련된 모든 오버 헤드가 무의미한 것처럼 보입니다.
매개 변수 전달 컨텍스트와 크게 다르지 않습니다. 값을 수정하지 않으려는 경우 const 참조로 전달하십시오. 수정하려는 경우 수정하지 않으려는 경우 암시 적 깊은 복사본을 만드십시오. 원본 객체를 수정하거나 수정하려는 경우 참조로 전달합니다. 다시 말하지만 COW는 아무 것도 달성하지 못하는 불필요한 오버 헤드처럼 보이며, 변경 사항이 원본 객체에서 분리되므로 원할 경우에도 원래 값을 수정할 수 없다는 제한 사항 만 추가합니다.
따라서 COW에 대해 알고 있는지 또는 알지 못하는지 여부에 따라 의도가 불분명하고 불필요한 오버 헤드가있는 코드가 생성되거나 예상과 일치하지 않고 머리를 긁을 수있는 완전히 혼란스러운 동작이 발생할 수 있습니다.
나에게 불필요한 딥 카피를 피하든, 만들려는지보다 더 효율적이고 읽기 쉬운 솔루션이있는 것 같습니다. 그렇다면 COW의 실질적인 이점은 어디에 있습니까? 나는 대중적이고 강력한 프레임 워크에서 사용되기 때문에 어떤 이점이 있어야한다고 생각합니다.
또한 내가 읽은 것으로부터 CW 표준 라이브러리에서는 COW가 명시 적으로 금지되어 있습니다. 내가 볼 수있는 죄가 그것과 관련이 있는지 알지 못하지만 어떤 식 으로든 이에 대한 이유가 있어야합니다.
[]
연산자 를 사용하든 관계없이 매우 나쁜 디자인처럼 보입니다 . 따라서 COW는 나쁜 디자인을 가능하게합니다. 많은 이점은 들리지 않습니다.) 마지막 단락의 요점은 타당 해 보이지만, 나는 내 자신의 암묵적 행동의 팬이 아닙니다. 사람들은 그것을 당연한 것으로 여기고, 코드가 예상대로 작동하지 않는 이유를 파악하는 데 어려움을 겪고 암시적인 동작 뒤에 숨겨진 것이 무엇인지 확인할 때까지 계속 궁금해합니다.