Objective-C 程序內存分佈

程序在運行中會佔用內存,一般內存中分爲堆區,棧區,代碼區等那麼Objective-C的內存分佈又是什麼樣的呢?

內存分佈

我們查看內存分佈是我們可以通過打印內存地址比如說堆和棧,他們的內存地址相距就非常非常遠,我們通過下面的圖片來了解內存程序運行時內存的分佈情況。

  • 全局區:存放全局變量和常量

    • 非初始化(bss):存放沒有被初始化或初始化爲0的全局變量;

    • 初始化(data): 初始化過的全局變量數據,用來保存初始化了的非0的全局變量 ;

  • 文字常量區(rodata):存放常量數據;

  • 程序代碼區(text):用來存放程序的代碼(如函數)和部分整數常量是可以執行的不被共享;

  • 棧區(stack):由系統自動分配,一般存放函數參數值、局部變量的值等。由編譯器自動創建與釋放;

  • 堆區(heap):由程序創建和釋放,相對自由一片區域,沒有大小限制,採用鏈表形式管理;

查看下方代碼查看分佈情況

//代碼爲前輩所有
//main.cpp
int a = 0; // 全局初始化區
char *p1; // 全局未初始化區
main {
    int b; // 棧
    char s[] = "abc"; // 棧
    char *p2; // 棧
    char *p3 = "123456"; // 123456\0在常量區,p3在棧上
    static int c =0// 全局靜態初始化區
    p1 = (char *)malloc(10);
    p2 = (char *)malloc(20); // 分配得來的10和20字節的區域就在堆區
    strcpy(p1, "123456"); // 123456\0在常量區,這個函數的作用是將"123456" 這串字符串複製一份放在p1申請的10個字節的堆區域中。
    // p3指向的"123456"與這裏的"123456"可能會被編譯器優化成一個地址。
}

上一篇中提到Block對應不同類型的Block,當然也存儲在不同區域。堆中的內存需要我們手打創建和釋放,相比較其他都是系統創建很釋放。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章