c++ 对象模型
c++ 对象模型
thefist11
难以忘记编程路上领导和好友的细致指导,所以必须努力!(真诚希望大家多多指导!)
展开
-
深度探索C++ 对象模型(7)-Data member的布局(虚继承)
虚拟继承namespace ObjectMultiDerived { class Point2d { public: // has virtual functions virtual void print() {}; private: float _x; float _y; }; class Point3d : public Point2d { public: // ... private: .原创 2020-07-31 14:42:36 · 200 阅读 · 0 评论 -
深度探索C++ 对象模型(7)-Data member的布局(多重继承)
多重继承namespace ObjectMultiDerived { class Point2d { public: // has virtual functions virtual void print() {}; private: float _x; float _y; }; class Point3d : public Point2d { public: // ... private: float _z; .原创 2020-07-31 14:23:58 · 190 阅读 · 0 评论 -
深度探索C++ 对象模型(7)-Data member的布局(无继承、继承无多态、继承多态、多层继承)
无继承继承无多态继承多态虚表 :用来存放基类的每一个虚函数,再加上首位的一个slots(支持RTTI)。每个class object导入一个vptr,提供执行期的链接,使得每一个class object都能找到虚函数表。constructor中生成vptr的初值,让其指向虚表。destructor销毁vptr前端模式:丧失了与C的兼容性、丧失了多态多重继承namespace ObjectConDerived{ class Concrete1 { pub.原创 2020-07-31 13:54:48 · 208 阅读 · 0 评论 -
深度探索C++ 对象模型(6)-Data member的存取
nonstatic data member需要在class object起始地址加上该member的偏移。class A {public: int x; int y;};A a;a.y = 0; //等价于&a.y = &a + &A::ystatic data member取一个static member的地址,会得到指向该数据类型的指针,而不是指向class member的指针总结在如下代码中:class Point3d {public: .原创 2020-07-31 13:24:10 · 254 阅读 · 0 评论 -
深度探索C++ 对象模型(6)-Data member的绑定
防御性程序设计1).将class声明起头处放data member;代码示例:class Point3d{ float x,y,z;public: //etc}2). class的声明处放inline function代码示例:class Point3d{public: Point3d(); float X() const;//对在类体内定义的函数,一般都省写inline}嵌套的 typedef示例代码namespace dataM.原创 2020-07-31 10:45:52 · 228 阅读 · 0 评论 -
深度探索C++ 对象模型(5)-Initialization list(3)
##4 points1.list中的项目次序是由class中的members声明次序决定,不是由initialization list中的的代码决定如下代码有一个陷阱,i值为一个不可预知未初始化的值。原因是按照定义 的顺序,i先被初始化,这个时候j还没有被初始化。 class X { int i; int j; public: X(int val) : j( val ), i( j ) }; 2. initialization list的代码先于构造函数代码执行3.原创 2020-07-30 14:53:49 · 240 阅读 · 0 评论 -
深度探索C++ 对象模型(5)-Initialization list(2)
Initialization list的作用是效率如下代码可以编译并运行,但是效率低下 class Word { String _name; int _cnt; public: Word() { _name = 0; _cnt = 0; // 是否使用initialization list 都是相同的 } };其等价于Word::Word(原创 2020-07-30 14:23:28 · 218 阅读 · 0 评论 -
深度探索C++ 对象模型(5)-Initialization list(1)
以下四种情况,一定要使用成员初始化列表:1.初始化一个引用成员2.初始化一个const成员示例代码为 class Shape { const int m_size; //const 常量 int & m_ref; // reference member float m_width; float m_height; public: Shape(int s, float w, float h) : m_size(s), m_ref(s) //只能在这初始化原创 2020-07-30 14:12:25 · 152 阅读 · 0 评论 -
深度探索C++ 对象模型(4)-Default Copy Constructor(4)
编译器层NRV优化(Named Return Value)原代码为: class testObj { friend testObj foo(double); public: testObj() { memset(array, 0, 10000 * sizeof(double)); } public: double array[10000]; inline testObj(const testObj &t)//优化代码 { memcpy(this,原创 2020-07-30 13:31:37 · 219 阅读 · 0 评论 -
深度探索C++ 对象模型(4)-Default Copy Constructor(3)
程序转化语意学1. 显式初始化原代码为:X x0; void foo_bar(){ X x1(x0); X x2 = x0; X x3 = X(x0); }编译器将产生拷贝构造函数,调用拷贝构造函数X::X(const X& xx):void foo_bar(){ X x1; X x2; X x3; x1.X::X(x0); x2.X::X(x0); x3.X::X(x0); }2. 参数初始化原代码为:X xx; foo(x原创 2020-07-29 23:48:33 · 244 阅读 · 0 评论 -
深度探索C++ 对象模型(4)-Default Copy Constructor(2)
没有Default Constructor,class Myclass{public: //...private: int a; char *str;};编译器执行的是“位逐次拷贝(Bitwise copy semantics)”Myclass ::Myclass(const Myclass & _my){ //合成的伪码 this->a = _my.a; this->str = _my.str;}编译器构造Default Constructor 只在原创 2020-07-29 23:14:36 · 375 阅读 · 0 评论 -
深度探索C++ 对象模型(4)-Default Copy Constructor(1)
3种地方出现:1.明确的调用拷贝构造函数class X{};X tmp;X xx=tmp;2.作为参数时,对临时变量调用拷贝构造函数void foo(X x);{};X xx;foo(xx);foo中的参数,这个临时变量实际上调用了拷贝构造函数,利用xx拷贝构造了自己3.作为返回值且返回值非引用返回时:X foo_bar(){ X xx; return xx;}实际上,返回的值是一个临时变量而非xx,这个临时变量利用xx拷贝构造了自己。...原创 2020-07-29 21:48:09 · 239 阅读 · 0 评论 -
深度探索C++ 对象模型(3)-默认构造函数Default Constructor续
(1)带有虚函数的类class Widget { public: virtual int flip() = 0; //.. }; void flip(const Widget* widget ) { widget->flip(); } //假设Bell和Whistle都派生自Widgetvoid main(){ Bell bell; Whistle w; flip(bell); flip(w); } 编译器的工作为:1).生成一个虚函数表vtbl,内原创 2020-07-29 20:51:22 · 174 阅读 · 0 评论 -
深度探索C++ 对象模型(3)-默认构造函数Default Constructor
1. Default Constructor只对base class subobjects和member class objects初始化,对data member不做操作2. 编译器构造Default Constructor 只在下面4种case:包含有带默认构造函数的对象成员的类 .继承自带有默认构造函数的基类的类 .有虚函数的类(需要初始化每一个class object的vptr) .有一个虚基类的类1.包含有带默认构造函数的对象成员的类 class Foo { publ原创 2020-07-29 17:13:14 · 284 阅读 · 0 评论 -
深度探索C++ 对象模型(2)-类的对象的内存大小_2
继续上文,看看继承类的大小1. Bear类 类对象的大小为24: 16+8class Bear : public ZooAnimal {public: Bear() {}; ~Bear() {}; void rotate() {}; virtual void dance() {}; protected: enum Dances { }; Dances dances_known; int cell_block;};Bear b;ZooAnimal *pz = &b原创 2020-07-23 16:09:37 · 135 阅读 · 0 评论 -
深度探索C++ 对象模型(1)-三种对象模型的设计
这里写自定义目录标题c++对象模型(1)类的成员Questions:虚函数表对象模型c++对象模型(1)类的成员数据成员. Static. Nonstatic成员函数. Static. Nonstatic. virtualQuestions:C++封装带来的布局成本是多大?由空类组成的继承层次中,每个类对象的大小是多大?虚函数表含有虚函数或其父类含有虚函数的类,编译器都会为其添加一个虚函数表vptr每一个类为每一个virtual函数产生一个指针,放在表格中,这个表格就是虚原创 2020-07-17 16:16:58 · 398 阅读 · 0 评论 -
深度探索C++ 对象模型(2)-类的对象的内存大小
Question: 32bit机器 1个指向地址1000的指针的大小是多少?指针类型涵盖地址空间整数指针1000~1003(32bit整数是4-bytes)void*指针不确定类的对象的内存大小•基类所有非静态数据成员的大小。由内存对齐而填补的内存大小。为了支持virtual有内部产生的额外负担。•继承类基类的内存大小+本身数据成员的大小代码验证class ZooAnimal {public: ZooAnimal() {} .原创 2020-07-23 10:56:47 · 233 阅读 · 0 评论
分享