Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory 大的分配-像连续的虚拟内存吗?_Memory_Virtual - Fatal编程技术网

Memory 大的分配-像连续的虚拟内存吗?

Memory 大的分配-像连续的虚拟内存吗?,memory,virtual,Memory,Virtual,在我的程序中,我创建了一个大型(约1000万个元素)对象列表,其中每个对象大约有500字节大。目前的分配是这样的: const int N = 10000000; object_type ** list = malloc( N * sizeof * list ); for (int i=0; i < N; i++) list[i] = malloc( sizeof * list[i]); const int N=10000000; 对象类型**list=malloc(N*size

在我的程序中,我创建了一个大型(约1000万个元素)对象列表,其中每个对象大约有500字节大。目前的分配是这样的:

const int N = 10000000;
object_type ** list = malloc( N * sizeof * list );
for (int i=0; i < N; i++)
    list[i] = malloc( sizeof * list[i]);
const int N=10000000;
对象类型**list=malloc(N*sizeof*list);
对于(int i=0;i
这是可行的——但我发现,由于分配了大量的小分配,运行时的很大一部分用于malloc()和后续的free()调用。因此,我将更改实现以分配更大的块。对我来说,最简单的方法是将所有内容分配为一大块


现在我知道在用户空间内存模型和实际物理内存之间至少有一个虚拟化级别,但是否仍然存在获取如此大的“连续”内存块时遇到问题的风险?

连续虚拟并不意味着连续物理内存。如果您的流程可以单独分配N个页面,那么它也可以在一次调用中分配所有页面(从许多角度来看,在一次调用中分配页面实际上更好)。在旧的32位体系结构上,虚拟内存地址空间的大小有限是一个问题,但在64位体系结构上,虚拟内存地址空间不再是一个问题。此外,即使在32位上,如果您可以单独分配10MM,那么您应该能够在一次调用中分配相同的10MM

也就是说,您可能需要仔细地重新审视您的设计,并重新考虑为什么需要在内存中分配10MM的元素