Hàm `purecopy` cần thiết là gì?


23

Tôi đã đi qua compile.elvà tôi nhận thấy công trình này :

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

Các purecopytài liệu nhà nước:

purecopy là một hàm dựng sẵn trong 'mã nguồn C'.

(OBJ nội soi)

Tạo một bản sao của đối tượng OBJ trong bộ lưu trữ thuần túy. Đệ quy sao chép nội dung của vectơ và ô khuyết điểm. Không sao chép biểu tượng. Sao chép chuỗi không có thuộc tính văn bản.

Vì vậy, tôi nghĩ rằng tôi hiểu tại sao nó có thể cần thiết nếu nó được dự kiến ​​có compile-commandchứa một khối phức tạp có thể yêu cầu sửa đổi vào một ngày sau đó. Tuy nhiên, nó chỉ là một chuỗi đơn giản, vậy tại sao purecopycần thiết? Nói chung, khi nào purecopycần thiết?

Câu trả lời:


31

purecopy không bao giờ cần thiết trong cấu hình người dùng hoặc thư viện bên thứ 3. Trong thực tế, nó là một no-op khi được gọi từ một cá thể Emacs bình thường. Từ lưu trữ tinh khiết :

Chức năng này là không hoạt động trừ khi Emacs đang được xây dựng và kết xuất ; nó thường chỉ được gọi trong các tệp Lisp được tải sẵn.

Một số thông tin cơ bản sau.

Lưu trữ tinh khiết

Emacs có một quá trình xây dựng hai giai đoạn. Đầu tiên, nó xây dựng một nhị phân đơn giản, sau đó chạy nhị phân này, tải một tập hợp các thư viện tích hợp đã chọn và sau đó kết xuất một hình ảnh bộ nhớ của quá trình và tạo emacsnhị phân thực từ kết xuất này.

Lý do cho quá trình phức tạp này là hiệu suất tốt hơn và sử dụng ít bộ nhớ hơn: Tải trước thư viện Emacs thiết yếu cho phép khởi động nhanh hơn, vì không cần IO nữa để tải thư viện tích hợp và giảm sử dụng bộ nhớ, vì các thư viện được tải sẵn có thể được chia sẻ giữa tất cả các trường hợp Emacs.

Vùng nhớ đặc biệt này chứa các thư viện được tải sẵn là kho lưu trữ thuần túy. Đó là chỉ đọc, do đó, tinh khiết, cho phép chia sẻ bộ nhớ đã nói ở trên. Do đó, purecopykhông có op trong các trường hợp Emacs bình thường: Dù sao nó cũng không thể ghi vào bộ lưu trữ thuần túy. Do đó, lưu trữ tinh khiết cũng được miễn thu gom rác.

Tuy nhiên, trong khi tạo và kết xuất hình ảnh bộ nhớ cho các thư viện được tải sẵn, các thư viện này có thể sử dụng purecopyđể đánh dấu các đối tượng cụ thể của Wap mark để phân bổ trong bộ lưu trữ thuần túy, thường là các đối tượng thường được sử dụng cần thiết cho toàn bộ thời gian của Emacs.

Các chuỗi trong lưu trữ thuần túy là các chuỗi hằng tĩnh tĩnh toàn cầu. Vì "make -k"sẽ được sử dụng thường xuyên trong việc chạy các phiên Emacs (có thể là lệnh biên dịch được sử dụng thường xuyên nhất, ngay cả ngày nay), nên giữ cho chuỗi này không đổi và tĩnh, để tránh phân bổ lại và thu gom rác không cần thiết.

Khái niệm về lưu trữ tinh khiết cũng là lý do tại sao thay đổi các .elfile của một số được xây dựng trong thư viện (đặc biệt startup.el, subr.elvà những người khác) không có tác dụng: Emacs không bao giờ thực sự tải các tập tin nguồn của các thư viện này. Thay vào đó, nó có mã byte được tích hợp vào nhị phân của nó và tải chúng từ một vùng nhớ đặc biệt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.