c/c++程序運行 內存分析

#include <iostream>
#include <bitset>
using namespace std;
class CEmpty
{
};
int main(int argc, char** argv)
{
	CEmpty *pObjInHeap = new CEmpty();
	CEmpty objInStack;
	cout<<"CEmpty類型的對象佔用內存大小(字節):"<<sizeof(CEmpty)<<endl;
	cout<<"堆上分配對象時,對象地址爲:"<<std::hex<<std::showbase<<pObjInHeap<<endl;
	cout<<"棧上分配對象時,對象地址爲:"<<std::hex<<std::showbase<<&objInStack<<endl;
	cout<<"堆上對象的內容是:"<<bitset<8>(*((char*)pObjInHeap))<<endl;
	cout<<"棧上對象的內容是: "<<bitset<8>(*((char*)(&objInStack)))<<endl;
	cin>>argc;
}

0_1309447525aZ2p.gif



內存類別:

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

堆區(heap):一般有程序員分配和釋放,若程序員不釋放,程序結束時可能有操作系統回收。注意,它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表。

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

文字常量區:常量字符串就是放在這裏的。程序結束後有系統釋放。

程序代碼區:存放函數體的二進制代碼。

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

調用函數時,首先進行參數壓棧,一般情況下壓棧順序爲從右到左,最後壓函數地址。


對於一個進程的內存空間而言,邏輯上可以分爲3個部分:代碼區、靜態數據區和動態數據區。動態數據區一般就是“堆棧”。“棧”和“堆”是兩種不同的動態數據區。棧是一種線性結構,堆是一種鏈式結構。進程的每個線程都有私有的“棧”,所以每個線程雖然代碼一樣,但是本地變量的數據都是互不干擾的。

//main.cpp

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

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章