C++拾遗(七)函数相关(2)

内联函数

内联函数与常规函数的区别在于:

1.常规函数:在执行调用指令时,先存储该指令的内存地址,将函数参数复制到堆栈,然后跳转到被调用函数起点的内存单元,执行函数,将返回值放      入寄存器,最后跳回到一开始被保存的指令处。

2.内联函数:编译器将函数调用替换为函数代码,不需要跳转,但是内存开销大。

PS:内联函数不能递归,内联函数的函数体不能过大。使用时在声明和定义的前面都要加上关键字 inline。

引用传值

当函数的参数为const引用时,编译器将在以下两种情况生成临时变量:

1.实参类型不匹配,但是可以转换为正确类型。

2.实参类型匹配,但不是左值。

使用临时变量时,行为与按值传递类似,原始数据不修改而使用临时变量。

PS:基类的引用可以指向派生类对象。

默认参数

默认参数在函数原型中给出,必须从右向左添加默认值。

函数重载

关键是参数列表不同,类型引用和类型在重载时被视为同一个特征标。

同时存在多个重载函数时,不能进行强制转换匹配。

重载函数在编译时将进行名称修饰,以区别不同的重载函数。

模板函数

这里的模板也称参数化类型。

类似交换两个任意类型变量的值:

1 template<class T>
2 void tSwap( T &a, T &b )
3 {
4    T temp;
5    temp = a;
6    a = b;
7    b = temp;
8 }

编译器将在编译时根据调用时使用的参数类型生成相应的函数。如使用 int,则将 T 替换成 int,生成一个函数。

这意味着模板并不能缩短最终编译的文件长度,它的好处在于安全地生成多个同样功能的函数以及减少手工编写代码量。

函数模板也可以重载,如:

1 template<class T>
2 void tSwap( T &a, T&b );
3
4 template<class T>
5 void tSwap( T *a, T *b, int n );

但是当参数列表形式相同,又想为特定的类型调用特定的函数时,可使用显示具体化或显示实例化:

 1 //函数模板
 2 template<class T>
 3 void tSwap( T &a, T&b );
 4
 5 //显示具体化
 6 template<> void tSwap<className>( className &A, className &B );
 7 //或者
 8 template<> void tSwap( className &A, className &B );
 9
10 //显示实例化
11 template void tSwap<className>( className &A, className &B );
时间: 2024-10-18 05:20:03

C++拾遗(七)函数相关(2)的相关文章

C++拾遗(七)——关联容器

关联容器(Associative containers)支持通过键来高效地查找和读取元素.两个基本的关联容器类型是 map 和set.map 的元素以键-值(key-value)对的形式组织:键用作元素在 map 中的索引,而值则表示所存储和读取的数据.set仅包含一个键,并有效地支持关于某个键是否存在的查询.set 和 map 类型的对象所包含的元素都具有不同的键,不允许为同一个键添加第二个元素.如果一个键必须对应多个实例,则需使用 multimap 或 multiset,这两种类型允许多个元

计算机基本知识拾遗(七)页面缓存数据的同步和恢复机制页

本讲座Linux页面缓存数据的同步和恢复机制页.数据同步和恢复是两个独立的页面概念.数据同步处理是存储器/数据一致性问题缓存数据和备份设备.页面回收是如何回收分配的内存空间不足的物理内存页.为了获得足够的空间来分配一个干净的页面,支持更高优先级的工作.步在随意时刻都有可能触发,页回收则是在物理内存使用达到一定阀值的时候触发. 数据同步就是把物理内存和页缓存中的脏页写回到后备设备的文件里去.有两种方式能够调用数据同步 1. 周期性的调用,主要是pdflush机制 2. 强制调用,比方调用sync,

C++拾遗(六)函数相关

返回值 C++规定返回值不能是 数组.但可以是其它任何类型(包括结构体和对象). 通常,函数将返回值复制到指定的CPU寄存器或内存单元中,然后调用函数调用该内存单元的值. 函数原型 参数列表中可以不包括变量名,原型中的变量名相当于占位符,不需要与函数定义中一样. 在C++中,原型的()中为空意味着没有参数,(...)意味着原型不指定参数列表,在原型之后定义参数列表. 通常,原型自动将被传参数强制转换为期望类型,条件是两者都是算术类型. 函数参数 声明多个参数的时候不能像声明变量一样组合声明,如:

计算机底层知识拾遗(七)页缓存数据同步和页回收机制

这篇说说Linux的页缓存数据同步和页回收机制.数据同步和页回收是两个独立的概念,数据同步处理的是内存/缓存的数据和后备设备的数据一致问题,页回收处理的是在内存空间不足时如何回收已分配的物理内存页,来获得足够空间分配干净页,支持优先级更高的工作.数据同步在任意时刻都有可能触发,页回收则是在物理内存使用达到一定阀值的时候触发. 数据同步就是把物理内存和页缓存中的脏页写回到后备设备的文件中去.有两种方式可以调用数据同步 1. 周期性的调用,主要是pdflush机制 2. 强制调用,比如调用sync,

Python 学习日记第七篇 -- 函数相关

一.装饰器前戏-闭包简单来说,python中函数的闭包就是在内部函数里对外部作用域(但不是全局作用域)的变量进行引用,这么说,不太好理解,下面的示例帮助理解 def outer(): a = 1 def inner(): # 内部函数inner print(a) # 调用外部环境变量 return inner f = outer() f() 上面的示例就是一个闭包,inner是个内部函数,inner里调用外部作用域变量a,a不是全局变量:这样构成了一个闭包.上面这个例子外部变量是给定的,那么我们

【朝花夕拾】内存拾遗

笔者从事Anroid开发有些年头了,深知掌握Anroid内存方面的知识的必要性,这是一个程序员必须修炼的内功.在面试中,它是面试官的挚爱,在工作中,它是代码质量的拦路虎,可见其重要性.在团队中,内存优化的工作又往往由经验丰富的老师傅来完成,可见要做好内存优化,不是一件容易的事情. 这方面涉及的知识比较多,分析起来也有一定的复杂性,笔者将通过一系列的文章来进行整理,将主要包括JVM,java内存管理,java垃圾回收,android内存管理,android内存优化技巧,android内存泄漏,常用

网络拾遗

网络拾遗 Part.1 - HTTP 协议 1. HTTP 特性 HTTP 协议构建于 TCP/IP 协议之上,是一个应用层协议,默认端口号是 80. HTTP 是无连接无状态的. 2. HTTP 报文 HTTP 协议是以 ASCII 码进行传输的,建立在 TCP/IP 协议上的应用层规范.规范把 HTTP 分为三个部分:状态行.请求头.请求主体.HTTP 定义了与服务器交互的不同方法,常用的有如下四种:GET .POST .DELETE .PUT. URL 全称是资源描述符,一个 URL 地址

Hibernate的七种映射关系之七种关联映射(二)

继续上篇博客 七.Hibernate双向一对多关联映射:让多的一端来维护关系. 主要是解决一对多单向关联的缺陷,而不是需求驱动的. 1.在Student.java实体类里添加Classes引用.private Classes classes; 2.Student.hbm.xml里添加many-to-one标签:<many-to-one name="classes" column="classesid"/>.Classes.hbm.xml在例子(六)里的那

Hibernate的七种映射关系之七种关联映射(一)

关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 一.Hibernate多对一关联映射:就是在"多"的一端加外键,指向"一"的一端. 比如多个学生对应一个班级,多个用户对应一个级别等等,都是多对一关系. 1."多"端实体加入引用"一"端实体的变量及getter,setter方法. 比如说多个学生对应一个班级,在学生实体类加入:private Grade grade; 2."多"端配置文