- 棧區(qū):由編譯器自動分配釋放脱货,無需手工管理岛都;
存放函數(shù)的參數(shù)值律姨、局部變量等;
操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧臼疫,后入先出择份。 - 堆區(qū):由程序員分配釋放,若程序員不釋放烫堤,就會造成內(nèi)存泄漏荣赶,程序結(jié)束時可能由系統(tǒng)回收。
- 全局區(qū)(靜態(tài)區(qū)):全局變量和靜態(tài)變量的存儲是放在一塊的鸽斟,初始化的全局變量和靜態(tài)變量在一塊區(qū)域拔创,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。內(nèi)存在程序編譯的時候就已經(jīng)分配好富蓄,這塊內(nèi)存在程序的整個運行期間始終不變剩燥,程序結(jié)束后由系統(tǒng)釋放
- 文字常量區(qū):存放常量,不允許修改立倍,常量字符串就是放在這里灭红。程序結(jié)束由系統(tǒng)釋放
- 程序代碼區(qū):存放函數(shù)體的二進(jìn)制代碼。
這五個區(qū)在內(nèi)存中是地址由高向低排布口注。
棧是內(nèi)存中一塊連續(xù)的內(nèi)存比伏,棧頂?shù)刂泛妥畲笕萘渴怯上到y(tǒng)預(yù)先規(guī)定好的,由高地址向低地址擴(kuò)展疆导。
堆是不連續(xù)的內(nèi)存區(qū)域赁项,向高地址擴(kuò)展,大小受限于系統(tǒng)有效的虛擬地址澈段。
====高地址=====
棧
堆
全局靜態(tài)區(qū)
文字常量區(qū)
程序代碼區(qū)
==== 低地址 =====
//main.cpp
int a = 0; // 全局初始化區(qū)
char *p1; // 全局未初始化區(qū)
main()
{
int b; // 棧
char s[] = "abc"; // 棧
char *p2; // 棧
char *p3 = "123456"; // 123456\0在常量區(qū)悠菜,p3在棧上。
static int c = 0败富; // 全局(靜態(tài))初始化區(qū)
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
// 分配得來得10和20字節(jié)的區(qū)域就在堆區(qū)悔醋。
strcpy(p1, "123456"); // 123456\0放在常量區(qū),編譯器可能會將它與p3所指向的"123456"優(yōu)化成一個地方兽叮。
}
優(yōu)缺點:
棧由編譯器管理芬骄,使用方便,速度快(系統(tǒng)底層支持鹦聪,有專門的寄存器存儲地址信息等)账阻,棧是內(nèi)存中一塊連續(xù)的內(nèi)存,不會產(chǎn)生內(nèi)存碎片泽本。缺點是內(nèi)存大小有限(1淘太、2M),并且不夠靈活(嚴(yán)格遵循先入后出原則)。
iOS主線程棧大小1MB蒲牧,其他線程是512KB撇贺。(Mac也只有8M)堆缺點:需手動管理、速度慢冰抢、容易產(chǎn)生內(nèi)存碎片松嘶,優(yōu)點是比棧靈活。