《inside the c++ object model》讀書筆記 之一:對象

關于對象


...引子:在C語言中,"數據"和"處理數據的操作(函數)"是分開來聲明的,語言本身并沒有支持"數據和函數"之間關聯性,這種程序成為"程序性的",由一組"分布在各個一功能為向導的函數中"的算法驅動,他們處理的是共同的外部數據.

...C++在布局以及存取時間上的主要額外負擔是有virtual引起的,包括:
? 1)virtual function 機制,用以實現一個有效率的"執行期綁定"
? 2)virtual base class 用以實現"多次出現在繼承體系中的 base class,有一個單一而被共享的實體"


1.對象模式:

1.1對象模式:
...C++中,有兩種class data members:static和nonstatic,以及三種class member functions:static,nonstatic和virtual,一共有三類C++對象模型:簡單對象模型,表格驅動對象模型,C++物件對象模型.
? 1)簡單對象模型:在此模型中一個object是由一系列的slots組成,每一個slot指向一個member,每個data member或是function member都有一個自己的slot
? 2)表格驅動模型:在此模型中,有兩個指針,一個指向data member table,另一個指向member function table,在這項兩個標志中存放著一系列slots,每一個slot指向一個data member或是一個function member.
? 3)C++物件對象模型:在此模型中,nonstatic data members被配置于每一個class object之內,static data members則被存放在所有的class object之外,static和nonstatic functions也被存放在所有的class object之外,virtual functions則有以下兩個步驟支持:
??? a)每一個class產生出一堆指向virtual functions的指針,放在表格之中,這個表格被稱為virtual table(vtbl).
??? b)每一個class object被添加了一個指針,指向相關的virtual table,通常這個指針被稱為vptr,vptr的設定和重置都有每一個class constructor,destructor和copy assignment運算符自動完成,每個vtbl的第一個slot一般都是指向type_info object.

...加上繼承:
? C++最初采用的繼承模型并不運用任何間接行:base class subobject的data members直接被置于derived class object中,在C++2.0以后才導入的virtual base class需要一些間接的base class表現方法.virtual base class的原始模型在class object之中為每一個關聯的virtual base class 加上一個指針,其他演化出來的模型則導入一個virtual base class table或者擴充已存在的virtual table來維護virtual base class的位置.


1.2關鍵詞struct:
..."struct那個關鍵詞,其實沒什么用"(Bell Lab)

...C++中凡是處于同一個access section的數據,必定保證以其聲明次序出現在內存布局中,然而被放置在多個access sections中的數據,排列次序就不一定有規定的順序.

...C struct在C++中的一個合理用途是,當你要傳遞"一個復雜的class object的全部或是部分"到某個C函數中去時,struct的聲明可以將數據封裝起來,并保證擁有與C兼容的空間布局,然而這項保證只在組合(composition)的情況下才存在,如果是繼承而不是組合在不行,因為編譯器會決定是否要有額外的data members被安插到base struct subobject之中.


1.3對象的差異:
...C++程序設計模型直接支持三種programming paradigms(程序設計典范):
? 1)程序模型:就像C一樣.
? 2)抽象數據類型模型:該模型所謂的"抽象"是和一組表達式(public接口)一起提供,而其運算符定義仍然隱而未明.
? 3)面向對象模型:在此模型中有一些彼此相關的類型,通過一個抽象的base class(用以提供共通接口)被封裝起來.

...C++用下列方法來支持多態:
? 1)經由一組隱含的轉化操作.
? 2)經由virtual function機制.
? 3)經由dynamic_cast和typeid運算符.
注:一般只有通過pointers或是references的間接處理,才能支持面向對象程序設計所需的多態.

...要表現一個class object需要多少內存?
? 1)其nonstatic data members的總和大小.
? 2)加上任何由于alignmennt的需求而填補的空間.(alignment就是將數值調整到某數的倍數,一般32位計算機上通產alignment為4bytes)
? 3)加上為了支持virtual而由內部產生的任何額外負擔.

...指針類型:"指向不同類型的個指針"在內存上均是一個地址,無任何差異,其不同之處在于其所尋址出來的objec類型不同,也就是說,"指針類型"會教導編譯器如何解釋摸個特定地址中的內存內容以及其大小.

...關于多態:
? 當一個base clas直接被初始化為一個derived class object時,derived object就會被切割(sliced),以塞入較小的base type內存中,于是derived將沒有留下任何痕跡,多態將不再出現.C++通過pointer或是reference來支持多態,這種程序設計風格成為"面向對象".

轉載于:https://www.cnblogs.com/suiyu/archive/2012/04/23/2466463.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377537.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377537.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377537.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

十六、保存和加載自己所搭建的網絡模型

一、保存自己搭建的模型方法一 例如:基于VGG16網絡模型架構的基礎上加上了一層線性層,最后的輸出為10類 torch.save(objmodule,f"path"),傳入需要保存的模型名稱以及要保存的路徑位置 保存模型結構和模型的參數,保存文…

uC/OS-II OS_TASK.C中有關任務管理的函數

函數大致用途 OS_TASK.C是uC/OS-II有關任務管理的文件,它定義了一些函數:建立任務、刪除任務、改變任務的優先級、掛起和恢復任務,以及獲取有關任務的信息。 函數用途OSTaskCreate()建立任務OSTaskCreateExt()擴展建立任務OSTaskStkChk()堆…

windows下寫的腳本,在linux下執行失敗

Windows中的換行符為CRLF, 即正則表達式的rn(ASCII碼為13和10), 而Unix(或Linux)換行符為LF, 即正則表達式的n. 在Windows和Linux下協同工作的時候, 往往這個細小的差別就導致問題, 如 1)Windows下寫的Shell腳本, 在Linux下運行時往往出現rn是無效參數, 不能執行; 2)vi 等編器下…

Scala中的do ... while循環

做...在Scala循環 (do...while loop in Scala) do...while loop in Scala is used to run a block of code multiple numbers of time. The number of executions is defined by an exit condition. If this condition is TRUE the code will run otherwise it runs the first …

十七、完整神經網絡模型訓練步驟

以CIFAR-10數據集為例,訓練自己搭建的神經網絡模型架構 一、準備CIFAR-10數據集 CIFAR10官網使用文檔 torchvision.datasets.CIFAR10(root"./CIFAR_10",trainTrue,downloadTrue) 參數描述root字符串,指明要下載到的位置,或已有數…

μC/OS-Ⅱ 操作系統內核知識

目錄μC/OS-Ⅱ任務調度1.任務控制塊2.任務管理3.任務狀態μC/OS-Ⅱ時間管理μC/OS-Ⅱ內存管理內存控制塊MCBμC/OS-Ⅱ任務通信1.事件2.事件控制塊ECB3.信號量4.郵箱5.消息隊列操作系統內核:在多任務系統中,提供任務調度與切換、中斷服務 操作系統內核為每…

第二版tapout

先說說上次流回來的芯片的測試情況。 4月23日, 芯片采用裸片直接切片, bond在板子上,外面加了一個小塑料殼來保護,我們就直接拿回來測試了。 測試的主要分為模擬和數字兩部分, 數字部分的模塊基本都工作正常&#xff0…

cd-rom門鎖定什么意思_CD-ROM的完整形式是什么?

cd-rom門鎖定什么意思CD-ROM:光盤只讀存儲器 (CD-ROM: Compact Disc Read-Only Memory) CD-ROM is an abbreviation of "Compact Disc Read-Only Memory". It is a data storage memory in the form of an optical compact disc, which is read by a syst…

遠程工作時的協作工具

遠程工作時的協作工具 Google Hangout 用于日常會議和面對面交談,在國內其實可以用qq來帶起。Campfire 用于一天來的持續對話。Screenhero 用于分享屏幕,一起寫代碼,這個比較有用,可以一起寫代碼。Balsamiq 用于計劃要制作的 UI。Asana 用于管理任務Google Docs 用于…

十八、完整神經網絡模型驗證步驟

網絡訓練好了,需要提供輸入進行驗證網絡模型訓練的效果 一、加載測試數據 創建python測試文件,beyond_test.py 保存在dataset文件夾下a文件夾里的1.jpg小狗圖片 二、讀取測試圖片,重新設置模型所規定的大小(32,32),并轉為tens…

二分法變種小結(leetcode 34、leetcode33、leetcode 81、leetcode 153、leetcode 74)

目錄二分法細節1、leetcode 34 在排序數組中查找元素的第一個和最后一個位置2、不完全有序下的二分查找(leetcode33. 搜索旋轉排序數組)3、含重復元素的不完全有序下的二分查找(81. 搜索旋轉排序數組 II)3、不完全有序下的找最小元素(153. 尋找旋轉排序數組中的最小值)4、二維矩…

ID3D11DeviceContext::Dispatch與numthread筆記

假定——[numthreads(TX, TY, TZ)] // 線程組尺寸。既線程組內有多少個線程。Dispatch(GX, GY, GZ); // 線程組的數量。既有多少個線程組。 那么——SV_GroupThreadID{iTX, iTY, iTZ} // 【線程組內的】線程3D編號SV_GroupID{iGX, iGY, iGZ} // 線程組的3D編號SV_DispatchT…

kotlin 查找id_Kotlin程序查找Square區域

kotlin 查找idFormula to find area of Square: area side*side 查找Square面積的公式: area side * side Given the value of side, we have to find the area of Square. 給定side的值,我們必須找到Square的面積。 Example: 例: Input…

小米手環6解決天氣未同步問題

最近我發現了我的米6手環天氣不同步,打開Zepp Life刷新同步也不行,后來我找了一些網上的解決方法,嘗試了一些也還不行,我這人喜歡瞎搗鼓,無意之間給整好了,后來我開始總結自己操作步驟,就在剛才…

c# datetime._C#| DateTime.Month屬性與示例

c# datetime.DateTime.Month屬性 (DateTime.Month Property) DateTime.Month Property is used to get the month component of this object. Its a GET property of DateTime class. DateTime.Month屬性用于獲取此對象的月份組成部分。 這是DateTime類的GET屬性。 Syntax: 句…

C++ 內存分配層次以及memory primitives的基本用法

分配層次 C memory primitives 分配釋放類型是否可重載mallocfree()C函數不可newdeleteC表達式不可::operator new()::operator delete()C函數可allocator::allocate()allocator::deallocate()C標準庫可自由設計并以之搭配任何容器 分配與釋放的四個用法 1、malloc and delet…

jQuery easyui layout布局自適應瀏覽器大小

首先解釋一下標題的含義,當我們用jQuery easyui layout 進行布局的時候,可能會遇到這樣一個問題,那就是當手工調整瀏覽器大小,或者最大化、還原窗口的時候,layout的某個區域不能填充因為瀏覽器擴大而產 生的空白區域&a…

JAVA 作業:圖形界面

自己動手寫的一個小JAVA 程序: 一個學生管理小系統,雖然很挫,但是這我學JAVA的第一步。學了2天JAVA沒有白費! 1 import java.awt.*;2 import java.awt.event.*;3 import java.util.ArrayList;4 5 import javax.swing.*;6 7 class …

一、Pytorch對自定義表達式自動求導

例如:y ax bx c,分別對a,b,c求導 若當a3,b4,c5,x1時 import torch from torch import autogradx torch.tensor(1.) a torch.tensor(3.,requires_gradTrue) b torch.tensor(4.,requires…

css菜單下拉菜單_在CSS中創建下拉菜單

css菜單下拉菜單CSS | 創建下拉菜單 (CSS | Creating Dropdown) Trivia: 瑣事: We know the importance of navigation bar on our webpage, we know the importance of a list of items too on our webpage but what is the importance of dropdown in web pages?…