題目:若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,即堆區,動態記憶體分配都是發生在堆區,堆區由程式設計師分配釋放,或程式...