C 切尼垃圾收集器:Win32 API调用

C 切尼垃圾收集器:Win32 API调用,c,winapi,memory-management,compiler-construction,garbage-collection,C,Winapi,Memory Management,Compiler Construction,Garbage Collection,我正在为一种语言编写一个垃圾收集器,我不确定应该使用哪个Win32 API调用来为切尼的算法分配往返空间。以下是正确的方法吗?如果不是,正确的方法是什么 初始化 现在我认为p=q=VirtualAllocNULL,dwSize,MEM_RESERVE,PAGE_READWRITE是为了分配两个半空间,每个半空间的大小为dwSize/2。不确定我是否应该使用MEM_RESERVE og MEM_COMMIT 分配 每当需要分配时,我就可以执行VirtualAllocq、sizeOfObj、MEM_

我正在为一种语言编写一个垃圾收集器,我不确定应该使用哪个Win32 API调用来为切尼的算法分配往返空间。以下是正确的方法吗?如果不是,正确的方法是什么

初始化

现在我认为p=q=VirtualAllocNULL,dwSize,MEM_RESERVE,PAGE_READWRITE是为了分配两个半空间,每个半空间的大小为dwSize/2。不确定我是否应该使用MEM_RESERVE og MEM_COMMIT

分配

每当需要分配时,我就可以执行VirtualAllocq、sizeOfObj、MEM_COMMIT、PAGE_READWRITE,假设我在初始化中保留MEM_,然后递增q

垃圾收集

将所有内容移动到空间后,我可以使用VirtualFreep、dwSize/2、MEM_DECOMMIT释放内存。MEM_DECOMMIT是正确的方法吗

必要链接:


为什么要保留连续空间,然后一次提交一半?为什么要分别保留和提交?为什么还要用VirtualAlloc呢?为什么不使用malloc或HeapAlloc?垃圾收集器应该使用VirtualAlloc。用MEM_RESERVE+PAGE_NOACCESS让你的生活变得复杂没有什么意义,优化一个使用少量虚拟机的程序也没有什么意义,它已经很快了。所以,只要承诺。您可能希望优化的唯一一件事是不要太快地使用VirtualFree,在接下来的几分钟内,让这些分配保持在雨中。除了David Heffernan的评论之外:LocalAlloc也是一个选项。如果您想在JIT编译器中创建可执行内存页,那么VirtualAlloc是必需的。