您好,登錄后才能下訂單哦!
一個由C/C++編譯的程序占用的內存分為以下幾個部分
例如:
#include "stdio.h"
int a = 0;//全局初始化區
char *p1;// 全局未初始化區
void main(void)
{
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放在常量區,編譯器可能會將它與
//p3所指向的"123456" 優化成一個地方。
}
stack:
由系統自動分配。
例如,聲明在函數中一個局部變量 int b; 系統自動在棧中為b開辟空 間
棧:只要棧的剩余空間大于所申請空間,系統將為程序提供內存,否則將報異常提示棧溢 出。
棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。意思是棧頂的地址和棧的最大容量是系統預先規定好的,在WINDOWS下,棧的大小是2M(也有 的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將 提示overflow。因此,能從棧獲得的空間較小。
存取效率的比較
char s1[] = "aaaaaaaaaaaaaaa";
char *s2 = "bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa 是在運行時刻賦值的;
而 bbbbbbbbbbb 是在編譯時就確定的;
但是,在以后的存取中,在棧上的數組比指針所指向的字符串(例如堆)快。
例如:
#include "stdio.h"
void main(void)
{
char a = 1;
char c[] = "1234567890";
char *p = "1234567890";
a = c[1];
a = p[1];
return;
}
對應的匯編代碼
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讀取字符,顯然慢了。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。