- 博客(9)
- 收藏
- 关注
原创 Inside C++ Object Model: The Semantics of Function
在C++的设计原则中,其中有一条就是成员函数的效率最差也不能比非成员函数的效率差。在C++中也确实是这样,这是怎么做到的?Nonstatic Member Functions简单来说,C++会将成员函数转化为一个普通的非成员函数。这种转换包括三步:1. 在参数列表中插入一个该类的指针,即this指针。如果是const成员函数,则该指针的类型也是const的。2. 将成员函数内的数据成员访问修改为通过入参的指针访问。3. 修改成员函数的名称,使其在整个程序中独一无二。这样,一个成员函数...
2022-02-14 23:37:41
442
原创 Inside C++ Object Model: Object Member Efficiency
这一节内容比较少,主要是对比了多种数据存放形式的成员访问效率。数据的存放形式包含基本类型、数组、结构体、封装、继承和虚继承。// 基本类型float p_a_x, p_a_y, p_a_z;float p_b_x, p_b_y, p_b_z;// 数组float[3] p_a, p_b;// 聚合struct Point{ float x, y, z;};//封装class Point{ float x, y, z;public: float &am
2022-01-09 23:45:54
451
原创 Inside C++ Object Model: Inheritance and the Data Member
在继承体系中,C++的标准并没有规定是基类成员放在前面还是派生类成员放在前面。但在具体的实现中,通常基类成员会放置在派生类成员的前面。但也有例外,这个例外就是当继承体系中具有虚基类时。没有多态的继承(Inheritance without Polymorphism) 对于下面这种实继承,一般情况下不会增加空间与时间的开销。采用这种设计可以清晰的表达两个类的关系,但是这种设计的缺点是什么呢?class Point2D{public: float x; ...
2022-01-09 22:27:10
365
原创 Inside C++ Object Model: The Semantics of Data
数据的语义(The Semantics of Data) C++有意思的一点是,标准从来不要求具体的C++实现,不同的编译器版本可以有不同的底层实现。这一点从虚继承这一点就可以看出来,比如下面的这些类:class X{};class Y : virtual public X {};class Z : virtual public X {};class A : public Y, public Z {};cout << "size of X is " <&l...
2021-12-25 22:45:10
283
原创 Inside C++ Object Model: Member Initialization List
成员初始化列表(Member Initialization List) 对类的成员进行初始化的时候,有两种方式,第一种是使用初始化列表;第二种是在构造函数体内初始化。class Node{public: Node(int x) : m_x(x) // 初始化列表 { Node* m_next = nullptr; // 构造函数体内初始化 } int m_x; Node* m_next;};...
2021-12-19 21:17:13
516
原创 Inside C++ object model: Program Transformation Semantics
程序转换语义(Program Transformation Semantics) 看到以下代码,你会想到哪些?也许你会有以下两个推断:每次调用GetNode时,都会以值的方式返回一个Node对象。 每次调用GetNode时,都会调用Node类的拷贝构造函数。class Node;Node GetNode(){ Node n; return n;} 以上两个推断看起来合情合理,但通过上一节我们知道,Node是否具有拷贝构造函数,取决于其自身...
2021-12-19 17:05:12
781
原创 Inside C++ Object Model: Copy Constructor Construction
Copy Constructor 用一个类对象去另一个同类对象有三种情形:Class Node;Node n;// 直接用另一个对象初始化Node m = n;// 这种初始化方式与Node m; m = n; 不同,这种是赋值,而不是初始化,首先调用Node的默认构造函数去初始化m,然后调用赋值构造函数,用n去“初始化”m// 对象作为函数参数 void fun(Node n);// 对象是函数的返回值Node getNode();Node m = get...
2021-12-11 00:02:24
365
原创 Inside C++ Object Model: The Semantics of Constructors
默认构造函数 在C++ Annotated Reference Manual中有提到,当有需要时,编译器应该位类合成默认构造函数。这里的关键是“有需要”,什么时候需要?被谁需要?都要看具体情况。编译器不会为所有的类提供默认构造函数,哪怕这个类不包含任何构造函数。对于以下代码片段,编译器不会为类Node合成默认构造函数。(真的不会吗?我一直以为会的,哪怕是将成员变量初始为垃圾值,他也是应该有构造函数的。)class Node{public: int val; ...
2021-12-07 22:24:39
451
原创 Inside C++ object model: Object lessons
Inside C++ object model: Object lessons
2021-12-05 23:59:26
242
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人