c 記憶體空間

2021-08-19 01:59:50 字數 2093 閱讀 8254

題目:若char是一位元組,int是4位元組,指標型別是4位元組,**如下:

class ctest

;

virtual

void mem_fun(){};

private:

char m_chdata;

int m_ndata;

static

char s_chdata;

};char ctest::s_chdata=』\0』;//靜態成員一般不可以在類內初始化,但是const的可以。

問題:

(1)若按4位元組對齊sizeof(ctest)的值是多少? 12

(2)若按1位元組對齊sizeof(ctest)的值是多少? 9

分析:

1 先找有沒有virtual 有的話就要建立虛函式表,+4

2 static的成員變數屬於類域,不算入物件中 +0

3 神馬成員都沒有的類,或者只有成員函式 +1

4 對齊法則(少的算多的)

其他:

1.sizeof的本質是得到某個型別的大小,即建立這個型別的乙個物件(或變數)的時候,需要為它分配的空間的大小。

2.static成員變數是儲存在靜態區當中,是乙個共享的量。因此,建立例項物件時,無需再為static成員變數分配空間。

綜上,sizeof計算類的大小的時候會忽略static成員變數的大小。

c++程式編譯後占用的記憶體分為如下幾個部分

1. 棧:由編譯器自動分配釋放,存放函式的引數值,區域性變數的值。在乙個程序中,位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式的呼叫。

2. 堆:由程式設計師分配和釋放,若程式設計師不釋放,則程式結束時被os**。存放由new,malloc分配的記憶體,可動態擴充套件和收縮。

3. 全域性區(靜態區):全域性變數和靜態變數的儲存是放在一起的初始化的全域性變數和初始化的靜態變數在一塊區域;未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。

4. 文字常量區:常量字串放在這裡,程式結束後由系統釋放。

5. 程式**區:存放函式體的二進位制**。

幾點說明:

1. 棧效率很高,大小有限:2m。如果分配過多空間,可能導致程式崩潰

例題:func_b 使用了太多的棧,程式可能會在執行時候崩潰。

#define size_20m (20*1024*1024)

void func_b()

靜態區的成員如果沒有初始化,系統會預設初始化。(所以包含全域性區。)

管理方式不同:棧由編譯器自動管理,無需手動控制;堆由程式設計師控制,容易產生memory leak。

能否產生碎片:對於堆來說,頻繁地new/delete勢必造成記憶體空間的不連續,從而造成大量碎片,使程式效率降低;對於棧來說,不會存在這個問題,因為棧是後進先出的佇列,一一對應,不會出現某個記憶體塊從棧中間彈出。

分配效率:棧是計算機系統提高的資料結構,作業系統在底層對棧提供支援,分配專門的暫存器存放棧的位址,壓棧出棧有專門的指令執行,這就決定了棧的效率比較高。對於堆則是由c/c++函式庫提供,顯然棧的效率比堆高。

先說乙個眾所周知的結論:

sizeof()不是函式,是關鍵字,在編譯之時就已經知道了物件的大小。

strlen()求字串大小時候,只算「\0」之前的。

編號情況

1『\0』 + 0

2『\0』30

因為』\0』的ascii碼是 0。

如果有兩個指標,都指向乙個字串常量。那麼經過編譯器優化,兩個指標指向的位置通常都是一樣的。

C 記憶體空間

乙個c 程式編譯後占用的記憶體分為如下幾個部分 棧 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值。在乙個程序中,位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式的呼叫。堆 由程式設計師分配和釋放,若程式設計師不釋放,則程式結束時被os 存放由new,malloc分配的記憶體,可...

c 記憶體空間

乙個可執行程式指令碼可以分為3個基本段,段,資料段,bss段 unix下可以使用size命令檢視可執行檔案的段大小資訊,size a.out header text 資料data bss 2 資料段.data 存放編譯階段就能確定的資料,可讀寫 3 段.text 段通常指用來存放執行d 的一塊儲存區...

C 記憶體空間分布

1.stack,即棧區,存放自動變數,以及函式呼叫時儲存的資訊。每當進行函式呼叫時,函式的實參和返回位址以及呼叫者的上下文環境會被存放在棧中 棧區由編譯器自動分配,從高位址向低位址擴充套件,為什麼會這樣?我也不知道 2.heap,即堆區,動態記憶體分配都是發生在堆區,堆區由程式設計師分配釋放,或程式...