內存空間分配和各種常量與變量

還是要寫博客。
今天覆習了很多東西。做個簡要總結。當然說的都是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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章