`purecopy` 기능은 무엇입니까?


23

나는 훑어 compile.el보고 있었고이 구조를 발견했습니다 .

(defcustom compile-command (purecopy "make -k ")) 

purecopy워드 프로세서 상태 :

purecopy는`C 소스 코드 '에 내장 된 함수입니다.

(순도 복사 OBJ)

순수한 스토리지에 오브젝트 OBJ의 사본을 작성하십시오. 벡터와 단점 셀의 내용을 재귀 적으로 복사합니다. 기호를 복사하지 않습니다. 텍스트 속성없이 문자열을 복사합니다.

따라서 compile-command나중에 수정이 필요한 복잡한 목록 이 포함되어 있어야하는 경우 왜 필요한지 이해 합니다. 그러나 단순한 문자열이므로 왜 purecopy필요합니까? 더 일반적으로 purecopy필요한 시기는 언제 입니까?

답변:


31

purecopy 사용자 구성 또는 타사 라이브러리에는 필요 하지 않습니다. 사실, 일반적인 Emacs 인스턴스에서 호출 할 때 아무 문제가 없습니다 . 에서 순수 저장 :

이 기능은 Emacs가 빌드되고 덤프되는 동안을 제외하고아무 문제없습니다 . 일반적으로 사전로드 된 Lisp 파일에서만 호출됩니다.

일부 배경 정보는 다음과 같습니다.

순수한 스토리지

이맥스는 2 단계 빌드 프로세스를 가지고 있습니다. 먼저 일반 이진 파일을 빌드 한 다음이 이진 파일을 실행하고 선택된 내장 라이브러리 세트를로드 한 다음 프로세스의 메모리 이미지를 덤프 한 다음 emacs이 덤프에서 실제 이진 파일을 만듭니다 .

이 복잡한 프로세스의 이유는 성능이 향상되고 메모리 사용량이 적기 때문입니다. 필수 Emacs Lisp 라이브러리를 사전로드하면 내장 라이브러리를로드하는 데 추가 IO가 필요하지 않으며 메모리가 감소하므로 사전로드 된 라이브러리가 있으므로 빠른 시작이 가능합니다. 모든 Emacs 인스턴스간에 공유 할 수 있습니다.

사전로드 된 라이브러리를 포함하는이 특정 메모리 영역은 "순수 스토리지"입니다. 위에서 언급 한 메모리 공유를 허용하는 것은 읽기 전용이므로 "순수"입니다. 따라서 purecopy일반적인 Emacs 인스턴스에서는 아무 문제가 없습니다. 어쨌든 순수한 스토리지에 쓸 수 없었습니다. 결과적으로 순수한 스토리지도 가비지 콜렉션에서 제외됩니다.

그러나 사전로드 된 라이브러리에 대한 메모리 이미지를 작성하고 덤프하는 동안 이러한 라이브러리를 사용 purecopy하여 순수 스토리지에 할당 할 특정 오브젝트, 일반적으로 Emacs의 전체 수명에 필요한 자주 사용되는 오브젝트에 "표시" 할 수 있습니다 .

순수한 스토리지의 문자열은 본질적으로 전역 정적 상수 문자열입니다. "make -k"Emacs 세션을 실행할 때 자주 사용 되기 때문에 (오늘날 가장 자주 사용되는 컴파일 명령 일 수 있음) 불필요한 재배치 및 가비지 수집을 피하기 위해이 문자열을 일정하고 정적으로 유지하는 것이 좋습니다.

순수 저장이 개념은 왜 수정 이유 .el몇 가지 내장 된 라이브러리 (특히의 파일 startup.el, subr.el이맥스는 결코 실제로 하중이 라이브러리의 소스 파일을 : 다른 사람을) 효과가 없습니다. 대신 바이너리 코드에 바이트 코드가 내장되어 있으며 특수 메모리 영역에서로드합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.