IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 【C++对象模型】 | 【04】程序转化语义 -> 正文阅读

[C++知识库]【C++对象模型】 | 【04】程序转化语义

一、程序转化语义

我们所写的代码,在内部是如何转换进行优化;

1、显示的初始化操作

class X{};
X x0;

void foo_bar() {
	X x1(x0);
	X x2 = x0;
	X x3 = X(X0);
}
会经过两个必要从程序转化阶段:
- 重写每一个定义(占用内存的行为),其中的初始化操作会被剥除;
- class的拷贝构造会被安插;

在这里插入图片描述

2、参数的初始化

方法一:当一个类对象作为参数,会导入临时性的对象,并调用拷贝构造将其初始化,在将临时的对象交给函数,当离开函数时,将会调用其析构函数释放;

方法二:以拷贝建构方式,把实际参数建构在位置上,记录在堆栈中,在函数返回之前将其析构;
X xx;       // X __temp0
            // __temp0.X::X(xx);
foo(xx);    // foo(__temp0);

3、返回值的初始化

返回值从局部对象中拷贝返回一般做一个双阶段转换:
- 先加上一个额外参数(reference),用来放置拷贝建构的返回值;
- 在return前插入拷贝构造调用的操作,将要返回的内容拷贝到reference中;
X bar() {   // void bar(X& __result)   添加额外参数
    X xx;   // X xx;
            // xx.X::X();  默认构造
            // __result.X::XX(xx);  拷贝构造
    return xx; // return;  无返回值
}

void test(){
    X xx = bar();   // X xx;
                    // bar(xx);
}

void test2() {
    bar().memfunc();    // X __temp0;
                        // (bar(__temp0), __temp0).memfunc();
}

4、在使用层面做优化

21. 必须返回对象时,别返回reference

在这个条例上告诉我们如何将一个对象进行返回,效率会比较高;
X bar(const T& y, const T& z) { // void bar(X &__result)
	return X(y, z);				// __result.X::X(y, z);	// 通过计算,而不是拷贝构造而得来的
								// return;
} 

5、在编译器层面做优化

编译器将result参数取代named return value(NRV);
该优化能大大的提供程序效率,但由于时编译器完成,故不能明确知道是否有被优化,且当函数较为复杂时,也难以被优化;
X bar() {		// void bar(X& __result)
	X xx;		// 默认构造被调用 __result.X::X()
				// 拷贝__result....
	return xx;
}

6、是否需要拷贝构造?

class Point3d {
public:
	Point3d(float x, float y, float z);
private:
	float _x, _y, _z;
};
根据以上的情况下,由于没有【1.类成员2.基类3.虚基类4.虚函数】带有拷贝构造;故在此情况下对成员进行bitwise copy即可;
如果类需要大量的memberwise操作,那么我们需要提供一个explicit inline的拷贝构造;
Point3d::Point3d(const Point3d& rhs) {
	// 扩张 __vptr__Point3d = __vtbl__Point3d;	若有虚函数
	memcpy(this, &rhs, sizeof(Point3d));
}
但使用memcpy()还是memset(),只有在类内不含任何由编译器产生的内部成员时才会有效运行;否则将会导致成员初值被改写;

7、成员初始化

4. 确定对象被使用前已先被初始化

class Word {
private:
	string name;
	 int val;
public:
	Word() : name(0) {
		// name.string::string(0);
	}	
};
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 10:59:30  更:2022-05-05 11:03:01 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 4:14:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码