程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Inside The C++ Object Model 讀書筆記(一)

Inside The C++ Object Model 讀書筆記(一)

編輯:C++入門知識

  自己對於C++的理解一向都不太深入,看到貌似許多牛人都讀過這本Inside The C++ Object Model,似乎深入了解C++必須讀這本書,於是決定啃一下。到手當天看了下目錄就知道這絕對是本好書。很多C++的書不知道是出於什麼目的,要麼不想講清楚,要麼就是講不清楚,總之根本就沒有將C++的一些機制寫出來,即使寫出來也有很多具有二義性,讓人完全不知所措。

  好了,閒話少說。之所以C++有許多很難理解的東西,原因之一就是C++背著我們做了太多的事情。這是我拿到這本書之後的第一反應。

  第一個解決的問題就是C++對象模型。C++對象模型究竟是什麼樣子,反正我在看這本書之前完全沒有概念,可能和我沒學過編譯原理有關,所以對於如下一些問題,就完全不知所措:

  
           
               ~         
  D:   function()=  
 (A)=?
 (B)=?
 (C)=?
 (D)=?

  一個空類,或者空類的對象,它的大小是多少,為什麼?每一個類的大小是多少,為什麼?這些問題在讀完第一章並聯系第三章以後便豁然開朗。

  首先對於一個空類,實際上它並不是空的,它有一個隱藏的1byte的char,這樣設計的原因是,能讓這樣一個類的不同對象能夠配置在一個獨一無二的地址上,能夠區分開來。所以sizeof(A)=1。這就是C++編譯器背著我們做的動作之一,也就是所謂implicit code。程序員寫的代碼基本上都應該叫做explicit code, 而編譯器添加進去的則稱之為implicit code。

  對於後面的問題,需要描述C++對象模型,以一個Point類為例: Point{

  static char _z;
  Point();

  類中有兩個int類型的成員變量,一個聲明為static的char型成員變量,一個構造函數,兩個虛函數,現在我們來看一下其真正的對象模型結構:

  

  也就是說,真正的對象(非空)中,並不是聲明了什麼就有什麼,而是只包含聲明的非靜態成員變量,和一個指向一個Virtual table的指針。

  這樣我們對對象的結構和大小就一目了然了,若類中沒有聲明或者繼承虛函數時,那麼就是對象的大小就是非靜態成員變量的大小之和(這裡先不考慮字節對齊的問題),如果有虛函數則對象中保存了一個指向虛函數表的指針,這個虛函數表是為了定位虛函數而設定的,而一個指針在32位的機器上占4個字節,所以這樣pt對象的大小就是12個字節。而對於上面的示例,B類中有兩個成員變量,但是靜態成員變量不存儲在對象中,所以sizeof(B)=4;C類中有3個非靜態成員變量,而32位的機器上默認是4字節對齊,所以兩個char和一個int共占用8個字節,sizeof(C)=2+2+4=8;因為D繼承了C,子類也擁有父類的成員,而且class D還有虛函數,需要有一個指向虛函數表的指針,因此sizeof(D) = 12。

  所以說C++背著我們做了太多的事情~!不了解編譯器或者說設計的思想,就永遠被蒙在鼓裡。

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved