自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(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 415

原创 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 412

原创 Inside C++ Object Model: Inheritance and the Data Member

在继承体系中,C++的标准并没有规定是基类成员放在前面还是派生类成员放在前面。但在具体的实现中,通常基类成员会放置在派生类成员的前面。但也有例外,这个例外就是当继承体系中具有虚基类时。 没有多态的继承(Inheritance without Polymorphism) 对于下面这种实继承,一般情况下不会增加空间与时间的开销。采用这种设计可以清晰的表达两个类的关系,但是这种设计的缺点是什么呢? class Point2D { public: float x; ...

2022-01-09 22:27:10 327

原创 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 252

原创 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 477

原创 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 753

原创 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 328

原创 Inside C++ Object Model: The Semantics of Constructors

默认构造函数 在C++ Annotated Reference Manual中有提到,当有需要时,编译器应该位类合成默认构造函数。这里的关键是“有需要”,什么时候需要?被谁需要?都要看具体情况。编译器不会为所有的类提供默认构造函数,哪怕这个类不包含任何构造函数。对于以下代码片段,编译器不会为类Node合成默认构造函数。(真的不会吗?我一直以为会的,哪怕是将成员变量初始为垃圾值,他也是应该有构造函数的。) class Node { public: int val; ...

2021-12-07 22:24:39 414

原创 Inside C++ object model: Object lessons

Inside C++ object model: Object lessons

2021-12-05 23:59:26 202

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除