c语言内存c语言内存分配方式

2024-03-16 10:27:32 浏览

c语言内存分配方式有下面三种:

c语言内存c语言内存分配方式

1.从静态存储区域分配

由编译器自动分配和释放,在程序编译的时候就已经分配好内存,这块内存在程序的整个运行期间都存在,直到整个程序运行结束时才被释放,如全局变量与static变量。

同样由编译器自动分配和释放,在函数执行时,函数内部的局部变量都可以在栈上创建,函数执行结束时,这些存储单元将被自动释放

(需要注意的是,栈内存分配运算内置于处理器的指令集中,它的运行效率一般很高,但是分配的内存容量有限。)

也称为动态分配内存,由程序员手动完成申请和释放。程序在运行的时,由程序员使用内存分配函数(如malloc函数)来申请内存,使用完之后再由程序员自己负责使用内存释放函数(如free函数)来释放内存。

C语言中只有通过内存地址访问。变量名事实上也是通过查询到对应的内存地址,然后访问的。

(1)在函数中申明的变量,是局部量。

(2)函数没有被调用时,不给局部量分配空间。此时不占用内存空间。

(3)函数 局部量的生命周期是从调用开始到调用结束。

只有在调用函数时,才临时分配空间,函数调用并执行完毕时,空间就会被释放。

函数调用和执行中,无论是否使用此变量,它都要占用内存空间,有地址。

(4)更精确地说,同变量所在的域(就是一对花括号之间的区域)有关,生命周期从进域开始到出域结束。

在C类型程序中,栈内存比较珍贵,大部分用在局部或者类成员(因为稀少… 不适合长时间占用一块栈内存),对于大量数据一般使用堆来分配。

重复用堆分配有一个显著的缺点就是容易造成外部碎片,在这种情况下系统内存不再连贯,一些内存得不到使用,久而久之系统内存会变的越来越少,长时间处理大数据会出现一些不可预料的问题。

1默认分配一块大的内存区域(类似内存池,默认大小是100M,构造的时候可以自己指定区域的大小),后期根据需要的内存动态增加新的内存区域(默认大小也是100M,如果需要使用的内存超过100M将会分配需要使用的内存加上最小范围值),以链表的形式进行链接;

2.使用链表结构标记已使用和已归还的内存范围;

3.每次获取内存时先从已归还的内存结构中进行匹配,如果没有匹配到合适的内存大小,将从内存区域中划分出一块新的内存使用;

4.增加每段内存的保护字节:1.最小范围值 默认为1个字节,2.最大范围值 默认为2个字节。每次获取内存时首先根据 ( 大于等于需要的内存加最小范围值 或 <= 需要的内存加最大范围值 )进行匹配已归还的内存结构;

5.内存区域以及内存链表结构都是使用计数表示在相同类型中的指定位置

6.清除指定内存区域(内存池)时,把标记使用这块内存的链表内存置为空,等待下次分配使用;

7.链表内存结构只会在对象析构的时候进行释放,保证了内存分配速度越来越快并且稳定的情况(不在对象使用的时候进行删除链表内存节点,保证了内存分配的效率);

  8.对象析构的时候会释放掉所有的内存区域(内存池)以及链表内存结构,保证了结构的稳定性。

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。