purecopy需要什么功能?


23

我浏览时compile.el发现了这种结构

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

purecopy文档说明:

purecopy是“ C源代码”中的内置函数。

(纯副本OBJ)

在纯存储中复制对象OBJ。递归复制vector和cons单元的内容。不复制符号。复制没有文本属性的字符串。

因此,我认为我理解为什么如果期望compile-command包含一个复杂的列表,可能需要在以后进行修改,那么为什么有必要这样做。但是它只是一个简单的字符串,所以为什么有purecopy必要?更一般而言,何时purecopy需要?

Answers:


31

purecopy 从来没有需要用户配置或第三方库。实际上,当从普通的Emacs实例调用时,它是无操作的。从纯存储

除了正在构建和转储Emacs之外,此功能是禁止操作的;通常仅在预加载的Lisp文件中调用它。

以下是一些背景信息。

纯存储

Emacs有两个阶段的构建过程。它首先构建一个普通的二进制文件,然后运行此二进制文件,加载一组选定的内置库,然后转储进程的内存映像,并从此转储中创建真正的emacs二进制文件。

进行此复杂过程的原因是性能更高且内存使用更少:预加载基本的Emacs Lisp库可以加快启动速度,因为不需要更多的IO来加载内置库,并且可以减少内存使用,因为预加载的库可以在所有Emacs实例之间共享。

包含预加载库的特定存储区域是“纯存储”。它是只读的,因此是“纯”的,以允许前述的内存共享。因此,purecopy在普通的Emacs实例中是“无操作”:无论如何,它无法写入纯存储。因此,纯存储也免于垃圾回收。

但是,在为预加载的库创建和转储内存映像时,这些库可用于purecopy“标记”要在纯存储中分配的特定对象,这些对象通常是Emacs整个生命周期都需要的常用对象。

纯存储中的字符串本质上是全局静态常量字符串。由于"make -k"将在运行Emacs会话中频繁使用它(即使在今天,它可能也是最常用的编译命令),因此有必要将此字符串保持不变和静态,以避免不必要的重新分配和垃圾回收。

纯存储这个概念也是为什么修改的原因.el一些内置库(尤其是中的文件startup.elsubr.el和其他人)没有任何影响:Emacs的实际上从未负载这些库的源文件。而是将其字节代码内置到其二进制文件中,并从特殊的存储区中加载它们。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.