热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

函数的参数输入(parameterlist)和返回值(returnvalue)

在C的世界里,语句块是封装的一种表现形式,而语句块大都以function的语法格式呈现。在使用function时,如何使得function

        在C++的世界里,语句块是封装的一种表现形式,而语句块大都以function的语法格式呈现。在使用function时,如何使得function的性能最优?可以从入参和返回值方面考量,这点是C++的语法规则,具有普适性;也可以从函数的执行语句块方面考量,这是算法实现问题,不同场景,不同应用,内部实现不同,实现最优,当有千人千面,很难有统一的规则。为此,此文只探讨从入参和返回值方面如何提高函数效率。

一、参数(parameter list)输入

        函数入参的方式有两种:传值(pass by value)和传引用(pass by reference)。

        所谓传值,就是对要传入函数的对象进行copy,然后将copy的对象传入函数。而对象的copy,就会涉及对象的创建(构造函数调用)和对原对象内容的赋值(copy构造或者赋值运算)。特别是自定义的数据类型,由于其属性(field)的嵌套深度,会导致一连窜的对象属性的创建与copy,给函数调用带来费时的操作。举例如下:

struct People
{People(...) {...}...
private:string name;int age;bool sex;
};struct Address
{Address(...) {...}...
private:string name;string location;
};struct Home
{Home(...) { ... }...
private:People people;string name;Address address;
};Home* copyHome(Home home)
{...
}

       调用上述copyHome函数,就会对home对象进行copy,而Home类中有属性People、string、Address,这些属性也会进行创建和copy,极大的降低了函数的调用效率。还有C++中大量使用面向接口编程,设计类的继承,如果将子类赋值给父类,然后把父类传入函数,将导致子类对父类的扩展特性丢弃掉,即所谓的对象切割问题(slicing)。因此,对于自定义的数据类型,使用pass by value是一个坏的选择。

      所谓传引用(pass by reference),就是给要传入的对象取个别名,将这个别名传入函数体。传引用就不存在对象的创建与copy,并且在继承体系也不存在对象切割问题。因此,对于自定义的数据类型,使用传引用是优质代码的选择。如果不想改变传入对象的值,最好使用常值引用(pass by reference to const)。举例如下:

Home* copyHome(const Home& home)
{...
}

【特例】如果是内置数据类型、STL中的迭代器、函数对象,上述讨论不适合,当采用pass by value形式。

二、函数返回值(return value)

       对于要返回函数体内的局部对象(local object),最好是返回该对象的copy,不要返回其reference。虽然可以将局部对象static化,但在多任务环境下带来重大问题。


推荐阅读
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 2023年京东Android面试真题解析与经验分享
    本文由一位拥有6年Android开发经验的工程师撰写,详细解析了京东面试中常见的技术问题。涵盖引用传递、Handler机制、ListView优化、多线程控制及ANR处理等核心知识点。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 2018年3月31日,CSDN、火星财经联合中关村区块链产业联盟等机构举办的2018区块链技术及应用峰会(BTA)核心分会场圆满举行。多位业内顶尖专家深入探讨了区块链的核心技术原理及其在实际业务中的应用。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 获取计算机硬盘序列号的方法与实现
    本文介绍了如何通过编程方法获取计算机硬盘的唯一标识符(序列号),并提供了详细的代码示例和解释。此外,还涵盖了如何使用这些信息进行身份验证或注册保护。 ... [详细]
author-avatar
会说话de狗尾草
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有