欢迎来到天天文库
浏览记录
ID:46533500
大小:147.00 KB
页数:23页
时间:2019-11-25
《C语言内存管理)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、堆和栈的区别一、预备知识一程序的内存分配一个由C/C++编译的程序占用的内存分为以一卜•儿个部分1、栈区(stack)—rfl编译器白动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构屮的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它•数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
2、・程序结束后有系统禅放4、文字常量区一常量字符串就是放在这里的。程序结束后山系统释放5、程序代码区一存放函数体的二进制代码。二、例子程序这是一个前辈写的,非常详细//main.cppinta=0;全局初始化区char*pl;全局未初始化区main(){intb;栈chars[]="abc";栈char*p2;栈char*p3="123456";123456 在常量区,p3在栈上。staticintc=0;全局(静态)初始化区pl=(char*)malloc(10);p2=(char*)malloc(20);分配得來得10和20
3、字节的区域就在堆区。strcpy(pl,“123456“);123456 放在常量区,编译器可能会将它与p3所指向的”123456“优化成一个地方。}一个程序一般分为3段:text段,data段,bss段text段:就是放程序代码的,编译时确定,只读,data段:存放在编译阶段(而非运行时)就能确定的数据,可读可写就是通常所说的静态存储区,赋了初值的全局变量和静态变量存放在这个区域,常暈也存放在这个区域bss段:定义而没有赋初值的全局变最和静态变量,放在这个区域C语言内存管理详解伟大的B订1Gates曾经失言:堆和栈的区别一、
4、预备知识一程序的内存分配一个由C/C++编译的程序占用的内存分为以一卜•儿个部分1、栈区(stack)—rfl编译器白动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构屮的栈。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。注意它•数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。・程序结束后有系
5、统禅放4、文字常量区一常量字符串就是放在这里的。程序结束后山系统释放5、程序代码区一存放函数体的二进制代码。二、例子程序这是一个前辈写的,非常详细//main.cppinta=0;全局初始化区char*pl;全局未初始化区main(){intb;栈chars[]="abc";栈char*p2;栈char*p3="123456";123456 在常量区,p3在栈上。staticintc=0;全局(静态)初始化区pl=(char*)malloc(10);p2=(char*)malloc(20);分配得來得10和20字节的区域就在堆
6、区。strcpy(pl,“123456“);123456 放在常量区,编译器可能会将它与p3所指向的”123456“优化成一个地方。}一个程序一般分为3段:text段,data段,bss段text段:就是放程序代码的,编译时确定,只读,data段:存放在编译阶段(而非运行时)就能确定的数据,可读可写就是通常所说的静态存储区,赋了初值的全局变量和静态变量存放在这个区域,常暈也存放在这个区域bss段:定义而没有赋初值的全局变最和静态变量,放在这个区域C语言内存管理详解伟大的B订1Gates曾经失言:640Koughttobeeno
7、ughforeverybody—BillGates1981程序员们经常编写内存管理程序,往往捉心WflUo如果不想触雷,唯一的解决办法就是发现所冇潜伏的地雷并n排除它们,躲是躲不了的。木文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。1、内存分配方式内存分配方式冇三种:(1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。(2)在栈上创建。在执行函数吋,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元口动被释放
8、。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。(3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何吋用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活
此文档下载收益归作者所有