
C++(对象模型)
本专栏内容来自于《深度探索C++对象模型》书的内容,作为本人的读书笔记。在此感谢作者Stanley B. Lippman以及本书中文翻译者侯捷
董哥的黑板报
90后程序员!
展开
-
C++(对象模型):09---Function之(多态、虚函数、虚函数表剖析)
我们在前面已经介绍了虚函数的一般实现模型: 每一个类有一个虚函数表(virtual table),内含该类的虚函数地址,然后每个对象有一个vptr(虚函数表指针),指向于虚函数表 一、多态的实现为了支持虚函数机制,必须能够对于多态对象有某种形式的“执行期类型判断法” 也就是说,对于下面的操作将需要ptr在执行期的某些相关信息(其中,z是虚函数),如此一来就能够找到并调用z()的适当实体...原创 2020-01-27 20:14:39 · 2659 阅读 · 1 评论 -
C++(对象模型):08---Function之(Function Member的各种调用方式(静态函数、非静态函数、虚函数)、附C++的mangling机制)
前言virtual函数是在20世纪80年代中期被加进来的,并且一开始受到了很多的之一 静态成员函数时最后被引入的一种函数类型。它们在1987年的Usenix C++研讨会的厂商研习营中被正式提议加入C++中一、非静态成员函数C++的设计准则之一就是:非静态成员函数至少必须和一般的非成员函数有相同的效率演示说明如果我们相对类对象进行操作,那么以下两个函数的调用都是相同效率的,因为...原创 2020-01-19 13:19:34 · 1344 阅读 · 1 评论 -
C++(对象模型):07---Data之(指向Data Members的指针)
待续原创 2020-01-18 11:54:06 · 713 阅读 · 0 评论 -
C++(对象模型):06---Data之(Data Member与“继承”(继承下的成员数据模型))
前言在继承关系下,一个类的数据成员规则如下: 派生类的数据成员为:其自身的数据成员加上基类的数据成员的综合 派生类与基类的数据成员的排列次序并未在C++标准中强制规定:理论上编译器自由安排。在大部分编译器上,基类的数据成员总是先出现 当有虚基类时,上面的规则就会失效(具体见下面讲解) 下面我们将从“单一继承不含virtual functions”、“单一继承并含有virtua...原创 2020-01-17 22:35:36 · 761 阅读 · 0 评论 -
C++(对象模型):05---Data之(Data Member的布局)
一、数据成员的布局规则我们以一个类声明为例,介绍数据的布局规则class Point3d{public: /*...*/private: float x; static List<Point3d*> *freeList; float y; static const int chunkSize = 20; float z;};程序解析每一个Point...原创 2020-01-13 11:02:15 · 578 阅读 · 0 评论 -
C++(对象模型):03---Data之(Data Member的存取)
引入下面的Point3d是一个类,我们有一个问题:影响x的存取效率的因素有哪些?Point3d origin;origin.x=0.0;下面我们有分别定义了类对象的变量形式与指针形式,那么通过origin和pt对数据成员存取有什么差异吗?Point3d origin,*pt=&origin;origin.x=0.0;pt->x=0.0;本文来讲解对数据成...原创 2020-01-02 22:59:53 · 717 阅读 · 0 评论 -
C++(对象模型):04---Data之(Data Member的绑定(类内成员与全局数据的冲突性问题))
一、考察下面的一个例子//某个foo.h头文件,有如下声明extern float x;//在Point3d.h文件中#include "foo.h"class Point3d{public: Point3d(float, float, float); //问题:这里返回的是哪一个x哪? float X()const { return x; } ...原创 2020-01-13 10:06:15 · 834 阅读 · 0 评论 -
C++(对象模型):02---C++对象内存大小模型
C++对象的内存大小由以下几个方面决定: 1.空类的大小默认为1 2.类中非静态成员的总和 3.如果有继承,派生类的对象会加上基类对象的数据成员 4.如果有virtual,那么就需要加上一个虚函数表指针的大小(在继承方式下,父子类共享一个虚函数表,因此子类的虚函数表指针是继承于父类的,不会新增一个虚函数表指针) 5.内存对齐补齐规则 一、无继承下的对象内存模型演示案例...原创 2020-01-01 22:27:02 · 769 阅读 · 1 评论 -
C++(对象模型):01---C++对象模式(The C++ Object Model)
前言本文介绍的是C++的对象模型,但不是C++的类内存模型一、C++成员种类在C++中,有两种类型的数据成员: 静态成员、非静态成员 在C++中,有三种类型的成员函数: 静态函数、非静态函数、虚函数 class Point {public: Point(float xval); virtual ~Point(); float x()const; static...原创 2020-01-01 21:26:13 · 1382 阅读 · 0 评论