标签:大小 es2017 地址 log 析构 编译器 手动释放内存 参数 字符串
首先是操作系统将代码程序加载到内存中
然后将内存分为4个区
栈区,程序的局部变量区,函数传递的参数,由编译器自动进行内存资源的释放。
堆区,动态内存申请,如果不手动释放内存,则这块内存不会进行析构。
全局区,静态区,常量区(字符串存放的位置),程序结束后,有操作系统释放
代码区,存放函数体的二进制代码。
最后,操作系统找到main函数的入口,就开始代码的执行。
一般内存四区中的栈的开口方向是向下的。为什么要这样设计呢,因为设计栈的方向向下,可以给应用程序设定栈的大小,这样就可以避免栈溢出。
不管栈是开口向上还是开口向下,BUFF的增长方向都是向上的。可以通过代码测出来。
如果栈的开口方向向下,那么BUFF的基址在下面,如果栈的开口方向向上,BUFF的基址也在下面,也就是说,不管栈的开口方向朝那里,BUFF的基址都在下面,
函数的调用模型:
在操作系统调用main函数的时候,会将main函数的返回地址和参数入栈,然后开始直行main函数,如果在main函数中调用了其他函数,会先将main函数的运行状态入栈,然后将被调用函数的返回值入栈,被调用函数的参数入栈,然后去执行被调用函数,如果还有其他调用函数,过程也是类似的。
在main函数中分配的内存,被调用函数是可以使用的。
main函数可以在栈上,堆上,全局区上进行分配内存,这些内存是可以被函数中被调用函数使用的。
而在被调用函数中栈上分配的内存,不能被主调函数使用,像堆上,还有全局区上分配的内存,都可以供主调函数使用,通过间接赋值的方式将内存的首地址传递出来就可以了。
这些都是比较容易理解的内容。
标签:大小 es2017 地址 log 析构 编译器 手动释放内存 参数 字符串
原文地址:http://www.cnblogs.com/andyniu/p/7632608.html