1. 程式人生 > >深度探索C++對象模型讀書筆記(一)

深度探索C++對象模型讀書筆記(一)

復雜 理解 image play 基礎上 isp 靜態 布局 bject

《深度探索C++對象模型》這本書也算是學習C++面向對象編程的必備書了,打算花上幾天先簡單的看一遍,這種書看上好幾遍也不一定能理解太多,慢慢積累一點一滴吃透就好。下面把我看書過程中覺得比較有意義的摘錄下來,也算是一種總結了。

第一章 關於對象

第一章首先談到了C++在C的基礎上增加對象封裝之後所需要的一些成本,總結一下就是面向對象設計的C++在結構的封裝上並不比C復雜太多,每個object中也只包含了data member,member function並不會包含在對象實體之中,面向對象特性所產生的布局以及時間上的額外負擔主要由virtual引起,以下是原文敘述:

技術分享圖片

技術分享圖片

C++對象模型

C++對象模型如下圖所示,所需要註意的就是每個存在虛函數的類都會有一個vtbl虛函數表數據結構,表中存在該類所有虛函數的地址指針,還存在該類的type_info 作為RTTI信息。類中所有的static成員全部分配在object之外。

技術分享圖片

技術分享圖片

關鍵詞struct和class

書中關於這兩個關鍵詞講了很多,有點繁雜了,在我看來記住以下幾點就差不多了:

1.struct和class關鍵詞並沒有太多差距,都能夠用來組裝數據結構,最顯著的區別就是struct內成員默認訪問權限為public,而class的默認訪問權限是private

2.struct和class更多的是C語言結構體和C++類兩種數據組裝理念的區別,前者只有數據,而後者把數據和方法進行了組合。

3.struct在C語言中存在許多trick,特別是其成員內存分配總是順序的,這使得我們能夠很方便的通過轉換指針類型對其成員實現訪問。而C++由於存在virtual機制的存在,其Object中的成員內存分配順序不定,在這方面的使用需要慎重。

技術分享圖片

C++多態的實現

技術分享圖片

技術分享圖片

C++對象內存的真正分配

主要有三部分:

1.非靜態數據成員

2.內存對齊所需空間,見另一篇文章https://www.cnblogs.com/J1ac/p/9039955.html

3.虛函數實現多態的開銷,一般指虛函數指針

技術分享圖片

深度探索C++對象模型讀書筆記(一)