PIMPL 돌리 기
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 을 사용 하여 API 와 ABI 의 일치 성 을 유지 할 것 입 니 다. Pimpl 이 현저 한 성능 을 떨 어 뜨리 지 않 는 한.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
데이터 지향 설계(Data Oriented Design)에서의 게임 개발에 대해서게임 개발을 할 때의 생각에는 데이터 지향 설계(Data Oriented Design)라는 것이 있습니다. 지난 수십 년 동안 CPU 성능이 1만배 이상인 반면 메모리 성능은 10배 미만밖에 되지 않았습니다. 또한 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.