1. 程式人生 > >C++筆試-2,基礎理論

C++筆試-2,基礎理論

return class operator 主函數 指向 def 占用 fff tor

該筆試題是借鑒其他博客的內容,記錄下來後面方便自己閱讀復習的

參考資料:

http://www.cnblogs.com/TonyEwsn/archive/2010/01/29/1659496.html

1.堆棧中的內容:

堆,隊列優先,先進先出。棧,先進後出

?一個由C/C++編譯的程序占用的內存分為以下幾個部分

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操作方式類似於數據結構中的棧。

2、堆區(heap)— 由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收。註意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。

3、全局區(靜態區)(static)— 全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另一塊區域。程序結束後由系統釋放。

4、文字常量區 — 常量字符串就是放在這裏的,程序結束後由系統釋放 。

5、程序代碼區— 存放函數體的二進制代碼。

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字節的區域就在堆區。

但是註意p1、p2本身是在棧中的。p1、p2是指針,放在棧中

strcpy(p1, "123456"); 123456\0放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。

棧:在Windows下,棧是向低地址擴展的數據結構,是一塊連續的內存的區域。這句話的意思是棧頂的地址和棧的最大容量是系統預先規定好的,在 WINDOWS下,棧的大小是2M(也有的說是1M,總之是一個編譯時就確定的常數),如果申請的空間超過棧的剩余空間時,將提示overflow。因此,能從棧獲得的空間較小。

堆:堆是向高地址擴展的數據結構,是不連續的內存區域。這是由於系統是用鏈表來存儲的空閑內存地址的,自然是不連續的,而鏈表的遍歷方向是由低地址向高地址。堆的大小受限於計算機系統中有效的虛擬內存。由此可見,堆獲得的空間比較靈活,也比較大。

棧由系統自動分配,速度較快。但程序員是無法控制的。

堆是由new分配的內存,一般速度比較慢,而且容易產生內存碎片,不過用起來最方便.

棧: 在函數調用時,第一個進棧的是主函數中函數調用後的下一條指令(函數調用語句的下一條可執行語句)的地址,然後是函數的各個參數,在大多數的C編譯器中,參數是由右往左入棧的,然後是函數中的局部變量。註意靜態變量是不入棧的。

當本次函數調用結束後,局部變量先出棧,然後是參數,最後棧頂指針指向最開始存的地址,也就是主函數中的下一條指令,程序由該點繼續運行。

堆:一般是在堆的頭部用一個字節存放堆的大小。堆中的具體內容有程序員安排。

在實際工作中的運用總結:

如果數據是需要頻繁讀取的,如電話本的聯系人數據,就先在module層定義一個結構體,

typedef struct CONTACTS_ITEM
{
int nId;
string strName;
string strSpelling;
vector<string> vNumber;
vector<int> vNumberType;

CONTACTS_ITEM()
{
nId = -1;
}

bool operator == (const CONTACTS_ITEM & tData) const
{
return (nId == tData.nId);
}

bool operator != (const CONTACTS_ITEM & tData) const
{
return !(*this == tData);
}

CONTACTS_ITEM & operator = (const CONTACTS_ITEM & tData)
{
if ( this != &tData )
{
nId = tData.nId;
strName = tData.strName;
strSpelling = tData.strSpelling;
vNumber = tData.vNumber;
vNumberType = tData.vNumberType;
}
return *this;
}

}T_CONTACTS_ITEM;

typedef vector<T_CONTACTS_ITEM> CONTACTS_VECTOR;

然後view層直接創建這個結構體的變量:

CONTACTS_VECTOR   m_SearchList ;

這樣生成的m_SearchList就是在棧中,好處是可以快速頻繁讀取。

但是如果數據量是比較大的,那麽就需要把這些數據放到類裏面而不是結構體裏面,然後new這個類的對象。這樣才可以避免內存溢出,數據溢出會導致APP崩潰,在linux下程序崩潰時會產生core文件,裏面可以定位到崩潰的原因,一般會有數組越位,內存溢出這些問題。做好對堆棧的前期管理,可以有效避免後期查找core文件的痛苦。

C++筆試-2,基礎理論