區域性變數 全域性變數 堆 堆疊 靜態和全域性(二)

2021-06-16 18:33:10 字數 796 閱讀 2580

7 訪問效率的比較

char s1 = "aaaaaaaaaaaaaaa"; 

char *s2 = "bbbbbbbbbbbbbbbbb"; 

aaaaaaaaaaa是在執行時刻賦值的; 而bbbbbbbbbbb是在編譯時就確定的; 但是,在以後的訪問中,在棧上的陣列比指標所指向的字串(例如堆)快。 

比如: 

#include 

void main() 

對應的彙編** 

10: a = c[1]; 

00401067 8a 4d f1 mov cl,byte ptr [ebp-0fh] 

0040106a 88 4d fc mov byte ptr [ebp-4],cl 

11: a = p[1]; 

0040106d 8b 55 ec mov edx,dword ptr [ebp-14h] 

00401070 8a 42 01 mov al,byte ptr [edx+1] 

00401073 88 45 fc mov byte ptr [ebp-4],al 

第一種在讀取時直接就把字串中的元素讀到暫存器cl中,而第二種則要先把指標值讀到edx中,在根據edx讀取字元,顯然慢了。 

小結: 

堆和棧的區別可以用如下的比喻來看出: 

使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。 

使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比較符合自己的口味,而且自由度大。

區域性變數 全域性變數 堆 堆疊 靜態和全域性

預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 乙個正常的程式在記憶體中通常分為程式段 資料端 堆疊三部分。程式段裡放著程式的機器碼 唯讀資料,這個段通常是唯讀,對它的寫操作是非法的。資料段放的是程式中的靜態資料。動態資料則通過堆疊來存放。在記憶體中,它們的位置如下...

區域性變數 全域性變數 堆 堆疊 靜態和全域性

預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 棧區 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩...

區域性變數 全域性變數 堆 堆疊 靜態和全域性

預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 乙個正常的程式在記憶體中通常分為程式段 資料端 堆疊三部分。程式段裡放著程式的機器碼 唯讀資料,這個段通常是唯讀,對它的寫操作是非法的。資料段放的是程式中的靜態資料。動態資料則通過堆疊來存放。在記憶體中,它們的位置如下...