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