内存空间分配和各种常量与变量

还是要写博客。
今天覆习了很多东西。做个简要总结。当然说的都是4G运行内存,32位机下。
空间分配,高地址到低地址依次为:内核,栈,堆,未被初始化的数据区,初始化的数据区,常量区,代码段。
内核,不用讲了。
:由高地址往低地址生长。函数调用时操作系统会在栈上开辟空间,是连续的一段空间,大约有2M左右。当函数调用结束时,操作系统会收回开辟的那段空间。栈溢出指的是这2M空间都被占用了,当再有函数被调用时,就不能开辟空间了,异常报错。导致栈溢出。
:堆很大,一般有2个G多,由低地址向高地址生长,C上使用malloc函数,C++中使用new关键字来开辟空间。空间是由程序员手动开辟的,所以是不连续的并且还要手动释放开辟的空间,防止内存泄露。堆中有很多零零散散的内存空间,操作系统是使用一个链表来维护堆中这些零零散散的内存,当程序员需要开辟一块空间时,操作系统就会遍历链表找到第一个大于所要开辟的空间的结点对应的空间,分配给程序员,再将分配给程序员多余出来的内存重新添加到链表中,供下次使用。
全局数据区:未被初始化的数据区和初始化的数据区都被称为全局数据区。这里面存放的都是一些静态全局变量,全局变量,静态局部变量。
常量区:这里存放的都是一些在代码使用的常量。
代码区:存放代码的地方,还有一个很重要的是#define MAX 255,此时,MAX就存放在代码区。
接下里,我们再说一下变量,常变量和常量。
先说常量吧。
常量就是一个定义时就被设置了初值,整个生命周期都不会被修改的,并且放在了一个只读的区域中。
常变量:由const定义的常量叫做常变量。如const int a = 1;a为常变量。
变量分为:全局变量,局部变量,成员变量,静态全局变量,静态局部变量,静态成员变量。带const都被称为常**。
全局变量:在全局范围内都可见的。生命周期随程序。在全局数据区中存储。
局部变量:在函数或语句范围内可见。生命周期随函数或语句。在栈上存储。
成员变量:跟随对象。对象在哪里,他就在哪里。一切都跟对象一样。
静态全局变量:只能被当前文件的全局范围可见。生命周期随程序。在全局数据区中存储。
静态局部变量:再函数或语句中可见,生命周期随程序。在全局数据区中存储。
静态成员变量:从属于类,跟对象没关系。存储在全局数据区。可以被所有对象可见。静态成员变量不能再定义时初始化,必须在类外初始化。也不能再构造函数的初始化列表初始化。

#define MAX 255 
//MAX为符号常量,不分配内存,存储在代码区中,不可寻址,
//255是整形常量,存储在常量区,可寻址。
int a = 1;
static int b = 2;
int d;//d在全局数据区的未初始化区。(bss)
int main()
{
	int a = 3;//a存储在栈中。
	static int b = 4;//b存储在全局数据区,只是出了这个函数,不可见。
	const int c = 1;//c在常量区。可寻址。

	//局部变量与全局变量同名时,想要调用全局变量就是用域解析符。
	cout << a << endl;//局部变量:3
	cout << ::a << endl;//全局变量:1
	//静态变量也是同理。
	cout << b << endl;
	cout << ::b << endl;

	//c = 2;//编译错误,c是常量,只读,不能被修改。
	char* p = "1234";//"1234"为常量,存储在常量区,
	p = "234";//编译通过,因为p是变量在栈上,存储在栈上。
	system("pause");
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章