PIMPL 돌리 기

4268 단어 메모리c + +
RAII 와 Pimpl 원본 주소http://tech.uc.cn/?p=851
RAII
RAII 는 Bjarne Stroustrup 교수 가 자원 분 배 를 해결 하기 위해 발명 한 기술 로 자원 획득 이 초기 화 된다.
RAII 는 C + + 의 구조 메커니즘 의 직접적인 사용 이다. 즉, 구조 함 수 를 이용 하여 자원 을 분배 하고 분석 함 수 를 이용 하여 자원 을 회수한다.
C / C + + 언어 에 서 는 동적 으로 분 배 된 메모리 에 대한 처리 가 매우 신중 해 야 한 다 는 것 을 잘 알 고 있 습 니 다.RAII 응용 프로그램 이 없 는 상황 에서 메모리 가 방출 되 기 전에 포인터 의 역할 영역 을 벗 어 나 면 이 메모 리 를 방출 할 기회 가 거의 없습니다. 쓰레기 수 거 기 를 제외 하고 우리 가 직면 해 야 할 것 은 메모리 누 출 입 니 다.
예 를 들 어 RAII 가 메모리 배분 에 사용 되 는 것 을 설명 합 니 다.
전형 적 인 C 스타일 코드 로 RAII 가 적용 되 지 않 았 습 니 다.그래서 주의해 야 할 것 은, destroyby tearray 는 역할 영역 을 종료 하기 전에 호출 되 어야 합 니 다.그러나 복잡 한 논리 디자인 에서 프로그래머 는 이 역할 영역 에서 분 배 된 모든 ByteArray 가 정확 한 방출 을 받 았 는 지 확인 하 는 데 많은 노력 을 기울 여야 한다.
비교 해 보면 C + + 운영 체 제 는 스 택 의 대상 이 역할 영역 에서 벗 어 나 면 분석 함수 가 실 행 될 것 이 고 자원 을 방출 하 는 시간 을 주 었 다.할당 대상 에서 delete 를 호출 하여 생명 을 끝내 야 합 니 다.
C + + 11 STL 의 std:: uniqueptr 는 역할 영역 에서 의 동적 분 배 를 제어 하 는 대상 에 사용 할 수 있 습 니 다.예 를 들 면:
함수 bar () 는 한 줄 만 추 가 했 을 뿐 많이 강 해 졌 습 니 다. 함수 bar () 가 실행 되 거나 이상 하 게 던 졌 을 때 holder 는 항상 분석 되 어 ba 또는 delete 되 었 습 니 다.
다음은 ByteArray 의 Ada 실현:
    -- lib.ads

    withinterfaces;

    withAda.Finalization;

    packagelib is

        typeuchars isarray(positive range<>)ofinterfaces.unsigned_8;

        typeuchars_p isaccessuchars;

        typeByteArray isnewAda.Finalization.Limited_Controlled withprivate;

        functionCreate(length:integer)returnByteArray;

    private

        typeByteArray isnewAda.Finalization.Limited_Controlled withrecord

            length:integer;

            data:uchars_p;

        endrecord;

        overriding

        procedureInitialize(This:inoutByteArray);

        overriding

        procedureFinalize(This:inoutByteArray);

    endlib;



    -- lib.adb

    withAda.Unchecked_Deallocation;

    packagebodylib is

        useAda.Finalization;

        functionCreate(length:integer)returnByteArray is

        begin

            iflength<0then

                put_line("Create");

                returnByteArray'(Limited_Controlled with length => length,

                       data=> new uchars(1..length));

            end if;

            return ByteArray'(Limited_Controlled withlength=>0,data=>null);

        endCreate;

        overriding

        procedureInitialize(This:inoutByteArray)is

        begin

            put_line("Initialize");

            this.length:=0;

            this.data:=null;

        endInitialize;

        overriding

        procedureFinalize(This:inoutByteArray)is

            procedurefree isnewAda.Unchecked_Deallocation(uchars,uchars_p);

        begin

            put_line("Finalize");

            if(this.data/=null)then

                free(this.data);

            endif;

        endFinalize;

    endlib;



    -- main.adb

    withlib;

    uselib;

    proceduremain is

        K:ByteArray:=Create(10240);

        C:ByteArray;

    begin

        null;

endmain; 

– 출력 은 다음 과 같 습 니 다. / main Create Initialize Finalize Finalize
다른 상황 은 I / O 자원 에 대한 처리 입 니 다. 자원 을 더 이상 사용 하지 않 을 때 자원 을 시스템 에 돌려 주어 야 합 니 다.다음 예 는 위 키 백과 에서 온 RAII 항목 입 니 다.
writeto_file 함수 에서 RAII 는 std:: ofstream 과 std:: lock 에 작용 합 니 다.guard, 함수 write 보장to_file 이 돌아 올 때 lock 과 file 은 항상 자신의 분석 함 수 를 호출 합 니 다. lock 에 있어 서 는 mutex 를 방출 하고 file 은 close 를 사용 합 니 다.
Pimpl
Pimpl (pointer to implementation) 은 매우 광범 위 하 게 응용 되 는 기술 로 그의 별명 도 매우 많다. 예 를 들 어 Opaque pointer, handle classes 등 이다.
위 키 백과 에 서 는 Ada, C, C + + 에 대해 예 를 들 었 습 니 다. 여 기 는 예 를 들 지 않 습 니 다.개인 적 으로 Pimpl 은 RAII 의 확장 이 라 고 생각 합 니 다. RAII 가 자원 에 대한 통 제 를 통 해 구체 적 인 데이터 레이아웃 과 구현 을 호출 자의 시선 에서 옮 겨 API 인 터 페 이 스 를 간소화 하고 ABI 호 환 을 가능 하 게 합 니 다. Qt 와 KDE 는 바로 Pimpl 을 사용 하여 API 의 일치 성 을 유지 하 는 동시에 타성 초기 화 에 경 로 를 제공 하고 암시 적 공유 에 기반 을 다 져 주 었 습 니 다.
나 는 코드 를 디자인 할 때 도 Pimpl 을 사용 하 는 것 을 고려 하지만 반드시 사용 하 는 것 은 아니다. 왜냐하면 Pimpl 도 부작용 을 가 져 올 수 있 기 때문에 주로 두 가지 측면 이 있다.
  • Pimpl 포인터 로 인해 메모리 공간 비용 이 증가 합 니 다
  • 유형 간 Pimpl 의 방문 은 간접 적 인 포인터 가 많이 필요 하 며, 다음 코드 에서 Teacher 는 Student 의 Context 를 방문 할 수 있 습 니 다.

  • 그럼 에 도 불구 하고 저 는 개인 적 으로 개발 응용 을 위 한 인터페이스 에서 Pimpl 을 사용 하여 API 와 ABI 의 일치 성 을 유지 할 것 입 니 다. Pimpl 이 현저 한 성능 을 떨 어 뜨리 지 않 는 한.

    좋은 웹페이지 즐겨찾기