C++对象模型
文章平均质量分 78
喵的波波鱼
爱生活,也爱技术!
展开
-
深度探索C++对象模型(17)——函数语义学(1)——函数调用方式
1.普通函数调用方式 代码: #include <iostream> #include <stdio.h> using namespace std; class MYACLS { public: int m_i; void myfunc(int abc) { m_i += abc; } }; void gmyfunc(MYACLS *ptmp, in...原创 2019-01-31 09:55:10 · 224 阅读 · 0 评论 -
深度探索C++对象模型(15)——数据语义学(5)——虚基类初探
引入虚基类前: 代码: #include <iostream> #include <stdio.h> using namespace std; class Grand //爷爷类 { public: int m_grand; }; class A1 : public Grand { public: int m_a1; }; class A2 : public...原创 2019-01-30 09:19:39 · 203 阅读 · 0 评论 -
深度探索C++对象模型(14)——数据语义学(4)——多重继承数据布局与this调整深谈
1.多重继承数据布局 代码1: #include <iostream> #include <stdio.h> using namespace std; class Base1 { public: int m_bi; virtual void mybvirfunc() {} Base1() { printf("Base1::Base1()的this指针是...原创 2019-01-29 23:48:22 · 181 阅读 · 0 评论 -
深度探索C++对象模型(13)——数据语义学(3)——单类继承下数据成员布局
1.单一继承下的数据成员布局 代码1: #include <iostream> #include <stdio.h> using namespace std; class FAC //父类 { public: int m_fai; int m_faj; }; class MYACLS :public FAC //子类 { public: int m_i; i...原创 2019-01-29 17:39:02 · 178 阅读 · 0 评论 -
深度探索C++对象模型(22)——函数语义学(6)——成员函数指针和vcall
1.指向成员函数的指针 成员函数地址,编译时就确定好的。但是,调用成员函数是需要通过对象来调用的; 所有常规(非静态)成员函数,要想调用,都需要一个对象来调用它; 所以对于使用成员函数指针调用普通成员函数,需要使用对象进行调用 代码: #include <iostream> using namespace std; namespace _nmsp1 //命名空间 { ...原创 2019-02-03 20:19:54 · 584 阅读 · 0 评论 -
深度探索C++对象模型(6)——对象(6)——程序优化
1.程序员角度优化 优化前: #include <iostream> #include <time.h> using namespace std; class A { public: int val1; int val2; public: A(int v1=0,int v2=0) :val1(v1),val2(v2) { cout <<...原创 2019-01-11 13:21:09 · 124 阅读 · 0 评论 -
C++中的内存区域——堆和栈的比较
参考链接:https://blog.csdn.net/sdfgh2046/article/details/5830807 https://blog.csdn.net/xtzmm1215/article/details/46810597 https://blog.csdn.net/ltag0110rtag/article/d...转载 2019-01-01 19:46:44 · 1032 阅读 · 1 评论 -
深度探索C++对象模型(5)——对象(5)——程序转化语义
我们写的代码,编译器会对代码进行拆分,拆分成编译器更容易理解和实现的代码,接下来将从我们程序员写代码角度和编译器理解角度去分析一些情况 1.定义时初始化对象 (1)程序员角度 #include <iostream> using namespace std; class A { public: int A_i; A(const A& a1) //拷贝构造函数 ...原创 2019-01-10 14:59:59 · 170 阅读 · 0 评论 -
深度探索C++对象模型(4)——对象(4)——拷贝构造函数语义
传统认识认为:如果我们没有定义一个自己的拷贝构造函数,编译器会帮助我们合成 一个拷贝构造函数。 结论:这个合成的拷贝构造函数,也是在 必要的时候才会被编译器合成出来。 示例代码 class A { public: int m_test; }; int main() { A a1; a1.m_test=20; A a2 = a1; retu...原创 2018-11-28 08:41:21 · 244 阅读 · 0 评论 -
深度探索C++对象模型(2)——对象(2)——this指针调整
this指针调整 首先看代码示例: #include <iostream> using namespace std; class A { public: int a; A() { printf("A::A()的this指针是:%p!\n",this); } void funA() { printf("A::funA()的this指针是:%p!\n",thi...原创 2018-11-25 14:02:14 · 220 阅读 · 0 评论 -
深度探索C++对象模型(3)——对象(3)——构造函数语义
默认构造函数(缺省构造函数)分析 即没有参数的构造函数 传统认识认为:如果我们自己没定义任何构造函数,那么编译器就会为我们隐式自动定义 一个默认的构造函数, 我们称这种构造函数为:“合成的默认构造函数” 结论:“合成的默认构造函数”,只有在 必要的时候,编译器才会为我们合成出来,而不是必然或者必须为我们合成出来。 必要的时候是什么时候? 示例代码 ...原创 2018-11-26 13:55:00 · 159 阅读 · 0 评论 -
Effective STL(1)——STL容器1-2
说明:由于最近在使用STL写算法练习,所以先来把Effective STL这本短小精悍的书,过一遍,让自己对STL理解更深一点,选择更合适的容器,能把代码写得规范一点 第1条:慎重选择容器类型 1.容器的分类 (1)C++标准库的分类 注意:array和forward_list,无序容器都是C++11引入的新标准(《参考C++Primer第五版》),我此处将不再使用《Effect...原创 2018-11-17 19:05:22 · 360 阅读 · 0 评论 -
本分类总述
本分类用来记录自己深入学习C++过程中对知识的总结,这也符合个人一贯的学习习惯,学会总结,让自己受益匪浅,并且在看书过程中,会有许多自己的思考和疑问,记录下来,供以后来看,不失为一个好方法 学习书籍路线 C++ Primer 第五版 深度探索C++对象模型 Effective C++ More Effective C++ Exceptional C++ More Exceptiona...原创 2018-11-17 16:18:42 · 140 阅读 · 0 评论 -
深度探索C++对象模型(12)——数据语义学(2)——数据成员布局、数据成员存取
1.数据成员布局 (1)成员变量地址规律 代码: #include <iostream> #include <stdio.h> using namespace std; //定义一个类 class MYACLS { public: int m_i; static int m_si; //声明不是定义 int m_j; static int m_sj;...原创 2019-01-29 08:51:01 · 157 阅读 · 0 评论 -
深度探索C++对象模型(21)——函数语义学(5)——函数调用、继承关系性能
1.函数调用中编译器的循环代码优化 代码: #include <iostream> #include <ctime> using namespace std; namespace _nmsp1 //命名空间 { __int64 mytest(int mv) { __int64 icout = 0; for (int i = 1; i < 100...原创 2019-02-03 11:43:00 · 299 阅读 · 0 评论 -
深度探索C++对象模型(20)——函数语义学(4)——多继承第二基类对虚函数支持的影响、虚继承下的虚函数
1.多继承第二基类对虚函数支持的影响 子类继承了几个父类,子类就有几个虚函数表 this指针调整的目的就是让对象指针正确的指向对象首地址,从而能正确的调用对象的成员函数或者说正确确定数据成员的存储位置。 多重继承下,有几种情况,第二个或者后续的基类会对虚函数的支持产生影响,即需要调整this指针 a)通过指向第二个基类的指针调用继承类的虚函数; b)一个指向派生类的指针,调用第二个基类中...原创 2019-02-03 08:20:25 · 211 阅读 · 1 评论 -
深度探索C++对象模型(19)——函数语义学(3)——单、多继承下的虚函数
1.单继承下的虚函数 代码1: #include <iostream> #include <stdio.h> using namespace std; class Base { public: virtual void f() { cout << "Base::f()" << endl; } virtual void g() { cou...原创 2019-02-02 22:53:41 · 233 阅读 · 0 评论 -
深度探索C++对象模型(18)——函数语义学(2)——动静态类型,绑定,多态性深入理解
1.静态类型和动态类型 静态类型: 对象定义时的类型,编译期间就确定好的 动态类型: 对象目前所指向的类型(运行的时候才决定的类型); 一般只有指针或者引用才有动态类型的说法。而且一般都是指父类的指针或者引用; 动态类型在执行过程中可以改变; 代码示例理解: #include <iostream> #include <stdio.h> using ...原创 2019-02-01 11:18:31 · 223 阅读 · 0 评论 -
深度探索C++对象模型(8)——虚函数(1)——虚函数表指针的位置和虚函数表分析
1.虚函数表指针的位置分析 一个类有虚函数的话,会产生一个虚函数表 而生成这个类的对象的时候,这个对象就会产生一个指针,指向虚函数表的开始位置,这个指针就是虚函数指针(vptr),有种类似于这个对象的成员变量,它是占字节数的,如在vs2017中占4个字节,在Linux下占8个字节 而vptr在对象内存中的位置取决于编译器 分析虚函数表指针的位置分析的代码: #include <i...原创 2019-01-15 23:25:27 · 758 阅读 · 0 评论 -
深度探索C++对象模型(11)——数据语义学(1)——数据成员绑定时机、进程内存布局
1.数据成员绑定时机 代码1: #include <iostream> using namespace std; string myvar = "I Love You"; //全局变量myvar class A { public: int myfunc(); //{ // return myvar; //} public: int myvar; //局部变量m...原创 2019-01-25 10:19:26 · 184 阅读 · 0 评论 -
深度探索C++对象模型(10)——虚函数(3)——单纯的类不纯时引发的虚函数调用问题
1.单纯的类 比较简单的类,即不包含虚函数和虚基类的类 代码: #include <iostream> #include <time.h > using namespace std; class X { public: int x; int y; int z; X() { memset(this, 0, sizeof(X)); cout <...原创 2019-01-24 23:55:21 · 204 阅读 · 0 评论 -
深度探索C++对象模型(9)——虚函数(2)——多重继承的虚函数表、vptr和vtbl的创建时机
1.多重继承的虚函数表 代码: #include <iostream> using namespace std; //基类1 class Base1 { public: virtual void f() { cout << "base1::f()" << endl; } virtual void g() { cout << ...原创 2019-01-24 12:53:58 · 543 阅读 · 1 评论 -
深度探索C++对象模型(7)——对象(7)——成员初始化列表
1.何时必须使用成员初始化列表 (1)如果初始化的成员是个引用 这里抛个问题留作后面补充总结的链接:在类中使用引用成员变量的作用? #include <iostream> using namespace std; class A { public: int a; int b; int& c; public: A(int& num) :c...原创 2019-01-13 13:19:35 · 245 阅读 · 0 评论 -
深度探索C++对象模型(1)——对象(1)
(1)一个类对象至少占用一个字节的内存空间,哪怕是一个空类 为什么sizeof(空类)=1,而不等于0? 因为该对象有内存地址,那么它至少占用一个字节,所以sizeof(void)=1 (2)类的成员函数不占用类对象的内存空间,虽然写在类当中,但不占用类的内存 结论:每个类的成员函数只声明一次,不随着对象而再次声明,跟着类走 (3) 非静态成员...原创 2018-11-21 10:48:32 · 199 阅读 · 0 评论