13.1.5 内存管理的开销
当在堆栈里自动创建对象时,对象的大小和它们的生存期被准确地内置在生成的代码里,这是因为编译器知道确切的类型、数量和范围。而在堆里创建对象还包括另外的时间和空间的开销。以下是一个典型的情况。(可以用calloc()或realloc()代替malloc())
调用malloc(),这个函数从堆里申请一块内存(这实际上是用了malloc()代码的一部分)。
从堆里搜索一块足够大的内存来满足请求。这可以通过检查按某种方式排列的映射或目录来实现,这样的映射或目录用以显示内存的使用情况。这个过程很快但可能要试探几次,所以它可能是不确定的—即每次运行malloc()并不是花费了完全相同的时间。
在指向这块内存的指针返回之前,这块内存的大小和地址必须记录下来,这样以后调用malloc()就不会使用它,而且当调用free()时,系统就会知道释放多大的内存。
实现这些运算的方法可能变化很大。例如,不能阻止处理器中的内存分配原语的执行。如果好奇的话,可以写一个测试程序来估计malloc()实现的方法。如果有的话,当然也可以读库函数的源代码。(GNU C的源代码总是有的。)