这篇文章里涉及到内存分配目前只是很浅显的一部分,不涉及到编译优化、查询obj等深入的东西。写这一篇文章的原因,个人认为做技术的就要对一个技术点深入了解,但这是在入门以后的事情,如果刚开始就要你把这些东西搞的非常透彻明白这无疑会加大学习的难度。
内存的分区:
1.BSS段,Block started by symbol不知为啥没有一个中文名字,是不是可以叫初始段呢,这个区域存储的是未初始化的全部变量或者static变量。
2.DataSegement:数据段,存放全局变量、静态数据。
3.Heap:堆,存放new和malloc分配的内存。
4.栈:局部变量、形参
生存周期:1,2,3程序运行期间都存在,其中heap里的内存要程序员手动释放或者程序结束后os释放。4的生存时间是随方法的结束而销毁。
5.常量区:存储常量
关于常量的说法,char *r = “HelloWorld!”;有人说这定义的是一个常量分布在常量区,并且不可以改变。随后又看到有人可以改变。自己做了下实验代码如下:
#include <iostream>
#define PI 3.1415
using namespace std;
int main(){
char *r = "hello word!";
char b[]="hello word!";
*r ='w';
*b = 'w';
cout<<r<<endl;
getchar();
return 0;
}
结果能通过编译,但是在运行的时候就有问题了,
所以说还是不可以i改变的把。
另一个困扰了我很久的问题:const修饰的变量,有人说const修饰的变量分配在只读数据段(话说有这个数据段吗,应该就是DataSegment),还有更多的说法,看了一下午也没怎么太明白。总结了一下:const作为一个限定修饰符不能决定变量分配在那个位置上,只是不能修改这个值,准确的讲是不让const修饰的变量位于=的左边,编译器也仅仅只是做到这一步。
const修饰的全局变量存储在只读数据段,编译期最初保存在符号表中,第一次使用的时候为其分配内存,并且只分配一次。
const修饰的局部变量还是分配在栈内。
本文只适合刚刚入门的入门级程序员了解大概的内存分布。