purecopy
从来没有需要用户配置或第三方库。实际上,当从普通的Emacs实例调用时,它是无操作的。从纯存储:
除了正在构建和转储Emacs之外,此功能是禁止操作的;通常仅在预加载的Lisp文件中调用它。
以下是一些背景信息。
纯存储
Emacs有两个阶段的构建过程。它首先构建一个普通的二进制文件,然后运行此二进制文件,加载一组选定的内置库,然后转储进程的内存映像,并从此转储中创建真正的emacs
二进制文件。
进行此复杂过程的原因是性能更高且内存使用更少:预加载基本的Emacs Lisp库可以加快启动速度,因为不需要更多的IO来加载内置库,并且可以减少内存使用,因为预加载的库可以在所有Emacs实例之间共享。
包含预加载库的特定存储区域是“纯存储”。它是只读的,因此是“纯”的,以允许前述的内存共享。因此,purecopy
在普通的Emacs实例中是“无操作”:无论如何,它无法写入纯存储。因此,纯存储也免于垃圾回收。
但是,在为预加载的库创建和转储内存映像时,这些库可用于purecopy
“标记”要在纯存储中分配的特定对象,这些对象通常是Emacs整个生命周期都需要的常用对象。
纯存储中的字符串本质上是全局静态常量字符串。由于"make -k"
将在运行Emacs会话中频繁使用它(即使在今天,它可能也是最常用的编译命令),因此有必要将此字符串保持不变和静态,以避免不必要的重新分配和垃圾回收。
纯存储这个概念也是为什么修改的原因.el
一些内置库(尤其是中的文件startup.el
,subr.el
和其他人)没有任何影响:Emacs的实际上从未负载这些库的源文件。而是将其字节代码内置到其二进制文件中,并从特殊的存储区中加载它们。