《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.mzph.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?…