C++對象模型筆記:對象實例內存佈局的小小結

前一篇筆記中已經說出了類的對象實例在內存中的三種可能的內存佈局,其中,最後一種是c++編譯器正在使用的。這種佈局的特點如下(先拋開虛函數方面的信息,說一般的)

 

1、非靜態(non-static)數據成員,每個對象實例的內存空間裏都有一份;

 

2、靜態(static)數據成員,靜態和非靜態的成員函數:整個內存空間裏面僅有一份(對象實例的內存空間是沒有這方面的信息的)

 

原來,什麼類的成員函數,什麼類的靜態數據成員啊,都是全局變量和全局函數啊,是不是有種受騙的感覺啊,搞了半天,什麼都是C語言的東西啊?

 

C++ 的目標是什麼?不就是爲了追求C的效率嘛?要追求C的效率怎麼辦?只有用C了。C沒有面向對象的封裝機制,因此,就像用戶提供了面向對象的語法,然後自己在背後將面向對象的東西轉爲C語言中的東西:全局變量,全局函數......所以,從本質上來說,下面的class point的定義:

 

 

經過編譯器的轉化之後,和下面的C代碼沒有什麼不同:

 

 

所以,Point的一個對象實例pt在內存佈局上,和C上面的struct Point是一樣的,都是隻有一個成員_x; 每個函數調用的開銷都是也和你用C語言寫的東西是一樣的。

 

有兩點需要說明一下:

 

1、 上面那個Point_PointCount()爲什麼不用傳指針啊?因爲在C++上面對應的是static int PointCount()static成員函數是沒有this指針的,它只能訪問static數據成員----對應到C的代碼裏面就是說,Point_PointCount()只訪問上面的全局變量_point_count,所以就不需要傳指針。

 

2 C++類裏面那個privateprotected的優點在C裏面沒有體現出來啊?是的,但是你可以和你的開發團隊裏面約定只能過函數來訪問結構體裏面的成員,違者一次罰款50塊錢,保證有效!!再說C++裏面的限定符也不見得是絕對的安全(見我的筆記之:privateprotectedpublic

 

看見了吧?從某種角度來說,這個世界上根本就沒有什麼所謂面向對象,只不過說的人多了,也就有了面向對象;面向對象只是一種概念而已。離開了實現,它什麼都不是~

 

或者也可以這樣說,什麼工具都用來做面向對象的方法,只要你應用得當;

 

可以說,我這一系列筆記的講解的地方,都是圍繞着這個觀念來說明的----C++特有的語法細節,來說明一個與語言無關,與技術工具無關,與平臺無關的一系列的技術思想(這大概就是傳說中的置之死地而後生的方法......),這個就是我讀Lippman這本書時的感受。

 

我這篇筆記,也沒有什麼新的技術講解,純粹是忽悠人的,呵呵。但是,如果能給某些新手以一些提示的話,就算忽悠,也有一點價值。

 

現在,問題來了:說類裏面的成員函數其實是全局函數,你蒙誰呢你?如果那裏真是全局函數,那麼下面的兩個類:

 

  

裏面的成員函數都是print,怎麼區分誰是誰啊???還有,如果真是全局函數,又怎麼會有重載,運算符重載等等的東西啊?

 

......

 

...確實是一個問題,但是我也要問一下,以顯得我在你們面前好像 很有學問的樣子:你知道山高自有客行路,水深自有渡船人這句話是誰說的嘛?你知道什麼叫做Name Mangling嘛?

 

欲知後事如何,請看下回分解,呵呵~

 

PS. “山高自有客行路,水深自有渡船人這句話,是在某本小說裏面的主人公對他的師傅說的,那本小說只要是中國人都知道的,你們不妨猜上一猜,是誰說的?呵呵。

 

 

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