ฟังก์ชั่น 'purecopy' จำเป็นสำหรับอะไร?


23

ฉันเปิดดูcompile.elและฉันสังเกตเห็นสิ่งก่อสร้างนี้:

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

purecopyเอกสารระบุ:

purecopy เป็นฟังก์ชั่นในตัวใน `ซอร์สโค้ด C '

(purecopy OBJ)

ทำสำเนาของวัตถุ OBJ ในที่เก็บข้อมูลแท้ คัดลอกเนื้อหาของเวกเตอร์และเซลล์ข้อซ้ำ ๆ ซ้ำ ๆ ห้ามคัดลอกสัญลักษณ์ คัดลอกสตริงโดยไม่มีคุณสมบัติข้อความ

ดังนั้นฉันคิดว่าฉันเข้าใจว่าทำไมมันอาจจำเป็นถ้าคาดว่าcompile-commandมี alist ที่ซับซ้อนที่อาจต้องแก้ไขในภายหลัง อย่างไรก็ตามมันเป็นเพียงสตริงธรรมดาทำไมจึงpurecopyจำเป็น? โดยทั่วไปเมื่อpurecopyจำเป็น?

คำตอบ:


31

purecopy ไม่เคยต้องการในการกำหนดค่าผู้ใช้หรือห้องสมุดบุคคลที่สาม ในความเป็นจริงมันเป็นno-opเมื่อถูกเรียกจากอินสแตนซ์ Emacs ปกติ จากPure Storage :

ฟังก์ชั่นนี้เป็นไม่มี-op ยกเว้นขณะที่ Emacs จะถูกสร้างขึ้นและทิ้ง ; มันมักจะเรียกว่าเฉพาะในไฟล์เสียงกระเพื่อมที่โหลดไว้แล้ว

ข้อมูลความเป็นมาบางส่วนมีดังนี้

การเก็บรักษาที่บริสุทธิ์

Emacs มีกระบวนการสร้างสองขั้นตอน มันสร้างไบนารีแบบธรรมดาก่อนแล้วจึงเรียกใช้ไบนารีนี้โหลดชุดบิวด์อินที่เลือกไว้จากนั้นemacsดัมพ์อิมเมจหน่วยความจำของกระบวนการและสร้างไบนารีจริงจากดัมพ์นี้

เหตุผลสำหรับกระบวนการที่ซับซ้อนนี้คือประสิทธิภาพที่ดีขึ้นและการใช้หน่วยความจำน้อยลง: การโหลดไลบรารี่ Emacs Lisp ที่จำเป็นล่วงหน้าช่วยให้การเริ่มต้นทำงานเร็วขึ้นเนื่องจากไม่จำเป็นต้องใช้ IO เพิ่มเติมในการโหลดไลบรารีในตัวและลดการใช้หน่วยความจำ สามารถแบ่งปันได้ในทุกกรณีของ Emacs

พื้นที่หน่วยความจำเฉพาะนี้ซึ่งมีไลบรารีที่โหลดไว้ล่วงหน้าคือ มันเป็นแบบ "บริสุทธิ์" แบบอ่านอย่างเดียวดังนั้นจึงอนุญาตให้แชร์หน่วยความจำดังกล่าวข้างต้น ดังนั้นจึงpurecopyไม่มีตัวเลือกในอินสแตนซ์ของ Emacs ปกติ: มันไม่สามารถเขียนลงในที่เก็บข้อมูลจริงได้ ดังนั้นการจัดเก็บที่บริสุทธิ์ยังได้รับการยกเว้นจากการเก็บขยะ

อย่างไรก็ตามในขณะที่สร้างและทิ้งอิมเมจหน่วยความจำสำหรับไลบรารีที่โหลดไว้แล้วไลบรารีเหล่านี้สามารถใช้purecopyเพื่อ "ทำเครื่องหมาย" วัตถุเฉพาะสำหรับการจัดสรรในที่เก็บข้อมูลแท้โดยปกติแล้ววัตถุที่ใช้บ่อยซึ่งจำเป็นสำหรับตลอดชีวิตของ Emacs อยู่แล้ว

สตริงในที่เก็บข้อมูลบริสุทธิ์เป็นสตริงคงที่ทั่วโลกเป็นหลัก เนื่องจาก"make -k"จะมีการใช้งานบ่อยครั้งในการเรียกใช้เซสชันของ Emacs (เป็นไปได้ว่าคำสั่งการรวบรวมที่ใช้บ่อยที่สุดแม้ในทุกวันนี้) มันสมเหตุสมผลที่จะทำให้สตริงนี้คงที่และคงที่เพื่อหลีกเลี่ยงการจัดสรรใหม่และการรวบรวมขยะ

แนวคิดของการจัดเก็บข้อมูลที่บริสุทธิ์และนี่ก็เป็นเหตุผลที่ว่าทำไมการปรับเปลี่ยน.elไฟล์บางตัวในห้องสมุด (สะดุดตาstartup.el, subr.elและอื่น ๆ ) ไม่มีผล: Emacs โหลดไม่จริงแฟ้มแหล่งที่มาของห้องสมุดเหล่านี้ แต่จะมีรหัสไบต์อยู่ในไบนารีและโหลดจากพื้นที่หน่วยความจำพิเศษ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.