Linux内存分配相关问题
如果每次分配,释放都是直接和操作系统打交道,则效率很低。 内存池:先向OS申请(批发)一大块内存,随后在用户需要时进行分配(零售)。类似的有线程池。这样效率高,比如不用用户态内核态切换。 Linux下glibc的malloc,free,delete,new使用的C运行时库,其提供的内存池方案是ptmalloc。 Linux下内存分配的一些原则:延迟分配,即只改变程序的逻辑地址,不实际分配物理页面,当需要访问对应的内存时才进行分配。用户调用free函数释放内存的时候,ptmalloc并不会立即将其归还操作系统,而是将其放入空闲链表(bins)中,这样下次再调用malloc函数申请内存的时候,就会从bins中取出一块返回,这样就避免了频繁调用系统调用函数,从而降低内存分配的开销。 int*p=new int[8]; delete []p; 上述代码如何根据p指针就能够正确释放8个int呢。 这个8x4=32字节的数据肯定有记录。在VS2019debug 下,其在p-3的4个字节的地址处。因此可以正确释放。但在release下不是这样,应该做了一些优化。类似的有局部静态变量,第二次使用该局部静态变量时如何知道其已经初始化过了。其地址附近也有一个变量用于指示是否已经初始化。 nm用于查看目标文件里面的符号,查看动态库的动态符号,nm -D <xxx.so>。 ldd 用于列出所依赖的动态库。
