天天看點

關于結構體和C++類的記憶體位址問題

關于結構體和c++類的記憶體位址問題

今天終于有時間寫點東西了~ 太爽了  *_*

很多人都知道c++類是由結構體發展得來的,是以他們的成員變量(c語言的結構體隻有成員變量)的記憶體配置設定機制是一樣的。下面我們以類來說明問題,如果類的問題通了,結構體也也就沒問題啦。

類分為成員變量和成員函數,我們先來讨論成員變量。

一個類對象的位址就是類所包含的這一片記憶體空間的首位址,這個首位址也就對應具體某一個成員變量的位址。(在定義類對象的同時這些成員變量也就被定義了)我們來以一段代碼說明問題:

//類的定義

class k{

public:

 k(){k = 12;}

 ~k(){}

 int k;

};

//類的使用

//...

 k ktemp;

 printf("%d--%d\n",&ktemp,&ktemp.k);

 printf("%d--%d\n",sizeof(k),sizeof(ktemp.k));

 int *i = (int*)(&ktemp);

 int w = *i;

 printf("%d\n",w);

運作上面的代碼,結果如下:

1310588--1310588

4--4

12

很明顯,類的記憶體大小和其唯一的成員變量的記憶體大小是一緻的。記憶體位址也是一緻的。

他們甚至可以互相轉換。換成結構體結果也是一樣。網友可以自己運作上面代碼來進行确認。

這個時候,可能有人會提出疑問了。那麼成員函數又如何?上面得代碼就好像類沒有任何成員函數一樣,根本說明不了問題。

呵呵,所有的函數都是存放在代碼區的,不管是全局函數,還是成員函數。

要是成員函數占用類的對象空間,那麼将是多麼可怕的事情:定義一次類對象就有成員函數占用一段空間。

我們再來補充一下靜态成員函數的存放問題吧:

靜态成員函數與一般成員函數的唯一差別就是沒有this指針,是以不能通路非靜态資料成員,就像我前面提到的,所有函數都存放在代碼區,靜态函數也不例外。所有有人一看到 static 這個單詞就主觀的認為是存放在全局資料區,那是不對的。(當然正在看我部落格的網友應該不至于犯這樣的問題,但是林子大了什麼鳥都有嘛,我在這裡多寫兩句,希望各位網友不要嫌我啰嗦哦)

繼續閱讀