4.1.2 类非静态成员函数返回值转换与NRV优化

news2025/3/9 10:40:47

类非静态成员函数返回值转换与NRV优化

下述代码即是Point3d的整体函数原型,对于第33行的调用,正常理解即会首先调用默认构造函数生成一个临时对象,进而调用拷贝构造函数将临时对象拷贝给p2。但是实际上任何编译器都不会采用上述的调用方法,因为临时对象的生成显然是没有必要的。 下述代码的执行结果如下所示,32行实际上只执行了一个默认构造函数。

Alt

class Point3d {
public:
    Point3d normalize() const;

    double magnitude() const;

    Point3d() { std::cout << "默认构造函数被执行" << std::endl; }

    Point3d(double m_x, double m_y, double m_z) : x(m_x), y(m_y), z(m_z) { std::cout << "含参构造函数被执行" << std::endl; }
    
	Point3d(const Point3d &p) : x(p.x), y(p.y), z(p.z) {
        std::cout << "拷贝构造函数被执行" << std::endl;
    }

private:
    double x{}, y{}, z{};
};

Point3d Point3d::normalize() const {
    auto mag = magnitude();
    Point3d normal{};
    normal.x = x / mag;
    normal.y = y / mag;
    normal.z = z / mag;
    return normal;
}

double Point3d::magnitude() const { return sqrt(x * x + y * y + z * z); }

int main() {
    Point3d p(1, 2, 3);
    auto p2 = p.normalize();
    return 0;
}

其实编译器在内部会将normalize转化为下面的形式,

//下述代码是伪码(编译器内部转化结果)
void normaliza_7Point3dFv(const Point3d *this, Point3d &_result) {
    auto mag = this->magnitude();
    _result.Point3d::Point3d();    //调用_result的构造函数
    _result.x = this->x;
    _result.y = this->y;
    _result.z = this->z;
    return;
}

其实一个更高效率的方法是直接构造normal值,这是定义代码需要如下所示:

Point3d Point3d::normalize() const {
    auto mag = magnitude();
    return {x / mag, y / mag, z / mag};
}

而在内部编译器会将其转化为下述的形式,这个版本相比于上一个的代码,这里只需要调用一个含参构造函数。相比于上一个版本的优化在于,上一个版本需要首先调用默认构造函数生成结果对象_result,然后后续通过一些赋值操作完成结果对象_result内对象的赋值。但是下述的代码是一次含参构造就完成了结果对象_result的构造,不涉及后续的任何变量赋值。

//下述代码是伪码(编译器内部转化结果)
void normaliza_7Point3dFv(const Point3d *this, Point3d &_result) {
    auto mag = this->magnitude();
    _result.Point3d::Point3d(this->x / mag,this->y / mag,this->z / mag);
    return ;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/19216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

四十七、Fluent近壁面处理

0. 前言 今天这篇文章&#xff0c;我们介绍一下近壁面处理的方式来求解湍流壁面物理规律。 前文四十五、四十六及本文四十七这三篇文章可以说是非常详细而系统的把壁面函数及相关理论全都介绍了一遍&#xff0c;大家可以参考进行设置。也希望大家能多多转发&#xff0c;点赞呀&…

MySQL中的锁机制、MyISAM表锁、MyISAM表级锁争用情况、MyISAM并发插入Concurrent Inserts、MyISAM的锁调度

前言: 关于读锁、写锁、乐观锁、悲观锁、行锁、表锁的理解可以看看以前我写的: 读锁、写锁、乐观锁、悲观锁、行锁、表锁 内部锁:在MySQL服务器内部执行的锁,以管理多个会话对表内容的争用。这种类型的锁是内部的,因为它完全由MySQL服务器执行,不涉及其他程序。 表级锁:…

JAVA中使用最广泛的本地缓存?Ehcache的自信从何而来 —— 感受来自Ehcache的强大实力

大家好&#xff0c;又见面了。 作为《深入理解缓存原理与实战设计》系列专栏&#xff0c;前面几篇文章中我们详细的介绍与探讨了Guava Cache与Caffeine的实现、特性与使用方式。提到JAVA本地缓存框架&#xff0c;还有一个同样无法被忽视的强大存在 —— Ehcache&#xff01;它…

Windows同时安装两个版本JDK,并实现动态切换JAVA8或者JAVA11

一、需求 对于Java开发工程师来说&#xff0c;可能手头上同时负责不同的项目&#xff0c;但是由于历史的原因&#xff0c;Java版本可能没有做到统一升级&#xff0c;有的项目是使用JDK8版本&#xff0c;有的项目使用的是JDK11的版本&#xff0c;那这时候就需要我们电脑同时兼容…

html2canvas 行内元素边框样式生成问题解决(根据文字生成图片)

项目场景&#xff1a; 实现一个基于一段文字生成一张图片的需求&#xff0c;其中&#xff0c;有一段文字需要下划线&#xff0c;但是不是text-decoration:underline;的样式&#xff0c;因为下划线要距离字一段距离&#xff0c;接到这个方案时&#xff0c;第一时间想到的就是ht…

在x86的Docker中构建TVM的ARM环境

文章目录前言1. 加载arm-ubuntu镜像2. 安装acl库3. 编译arm运行时4. 编译在x86运行在arm4.1 在x86的环境中构建arm的编译环境4.2 测试x86-ubuntu与arm-ubuntu能否ping通4.3 调用RPC4.4 ACL的使用5. arm版的tvm编译和运行时环境5.1 构建arm版的tvm编译和运行时环境5.2 关于ubunt…

卷积版wav to image 训练实例

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景 正文 总结 背景描述

Java语言知识大盘点(期末总复习)二

&#x1f339;作者:云小逸 &#x1f4dd;个人主页:云小逸的主页 &#x1f4dd;Github:云小逸的Github &#x1f91f;motto:要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前…

2022年珠海市第三届半导体行业集成电路测试工竞赛成功举办

11月19日&#xff0c;2022年珠海市第三届职业技能大赛暨香洲区第七届“香洲工匠”职业技能竞赛半导体行业集成电路测试工竞赛在珠海这片创新热土上成功举办&#xff0c;48支集成电路高素质技能人才队伍齐聚香江&#xff0c;同台竞技&#xff0c;碰撞出绚烂的“芯”火花。 香洲区…

Spring之Gateway网关

前言 什么是网关&#xff1f;简单理解就是我们所有服务的入口&#xff0c;当我们使用了微服务以后&#xff0c;每个服务都会有一个对应的接口&#xff0c;比如我们有用户服务&#xff0c;订单服务等等&#xff0c;如果没有网关的话&#xff0c;那么前端是这样调用的 很明显app和…

Design a TinyURL

title: Notes of System Design No.02 — Design a TinyURL date: 2022-05-05 13:23:57 tags: 系统设计 categories: 系统设计 description: " Design a TinyURL" 1.Functional Requirements 1.长链接->短链接(写) 2.短链接->长链接(读) 3.可以设置超时时间…

unittest框架

unittest框架1.通过unittest框架创建测试2.通过unittest框架添加断言3.自动化用例管理TestLoader类的用法4.unittest智能封装等待1.通过unittest框架创建测试 1.必须继承于unittest.TestCase类 2.可以定义setUp和tearDown方法进行初始化&#xff0c;每条测试用例开始或结束会执…

谷歌浏览器-chrome浏览器占用电脑CPU过高、容易崩溃的解决办法

一、问题背景 最近特别难受的一点——谷歌浏览器总是莫名其妙崩溃&#xff0c;而且明明是只开了两三个标签页的情况下。 不管是谷歌自己的任务管理器&#xff0c;还是win10自带的任务管理器&#xff1b;在崩溃情况下&#xff0c;谷歌浏览器的电脑cpu占用率高达80以上。 网上…

Java01-JDK1.8下载安装教程(win11版)

文章导航JDK 1.8 官网下载&#xff08;下载慢&#xff09;百度网盘下载&#xff08;下载快&#xff09;安装过程JDK环境配置教程验证JDK是否安装成功使用JDK1.8的原因当下互联网行情以及个人建议JDK 1.8 官网下载&#xff08;下载慢&#xff09; 点击跳转至JDK1.8官方网址 32…

暴雪和网易分手百万玩家何去何从

暴雪和网易分手百万玩家何去何从 这两天看到很多报道说网易与暴雪分手的消息&#xff0c;作为一个游戏玩家我甚是感到很意外。 看了不少相关的报道消息才有了今天的这篇文章 暴雪和其旗下《魔兽世界》等游戏陪伴了我们这一代人成长&#xff0c;或许终究不属于这个时代。看到暴…

智慧路灯解决方案-最新全套文件

智慧路灯解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧路灯全套最新解决方案合集一、建设背景 智慧城市是利用信息通信技术感知、分析、整合城市运行核心系统的各种关键信息&#xff0c;从而改善民生、环保、公共安全、城市服务、智能响应包括工…

【Java八股文总结】之反射

文章目录Java反射一、泛型1、何为泛型&#xff1f;2、泛型通配符Q&#xff1a;泛型擦除是什么&#xff1f;3、泛型上限和下限二、反射1、何为反射&#xff1f;2、反射有什么用&#xff1f;3、反射应用场景有哪些&#xff1f;Q&#xff1a;反射的优缺点&#xff1f;4、反射获取C…

三极管集电极电阻的作用

放大状态&#xff1a;电流信号转变为电压信号 饱和状态 ;发射极正偏&#xff0c;集电极反偏 当有无电阻的作用。当集电极有电阻时&#xff0c;可以得到随IC电流变化的电压信号&#xff0c;当工作在饱和状态。集电阻电阻越大。越容易进入饱和状态.当Ib有个小电流,Ic会出现大的…

Dubbo的SPI机制

目录 什么是 SPI Java SPI 示例 Java SPI 源码分析 想一下 Java SPI 哪里不好 Dubbo SPI Dubbo SPI 简单实例 Dubbo 源码分析 getExtensionClasses Adaptive 注解 - 自适应扩展 Adaptive 注解在类上 Adaptive 注解在方法上 WrapperClass - AOP injectExtension - …

webpack 官方文档解读一(详细使用教程) 起步

什么是webpack 就是个打包工具。通过一系列插件帮你优化项目&#xff0c;压缩&#xff0c;混淆等。总之什么脏活累活都能干。 入门案例 创建一个目录&#xff0c;并安装webpack和webpack-cli这两个包。webpack包是webpack本体&#xff0c;webpack-cli是他提供的工具包。 mk…