C++ inline内联函数详解

函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码。CPU 在执行主调函数代码时如果遇到了被调函数,主调函数就会暂停,CPU 转而执行被调函数的代码;被调函数执行完毕后再返回到主调函数,主调函数根据刚才的状态继续往下执行。

如果函数体代码比较多,需要较长的执行时间,那么函数调用机制占用的时间可以忽略;如果函数只有一两条语句,那么大部分的时间都会花费在函数调用机制上,这种时间开销就就不容忽视。

为了消除函数调用的时空开销,C++ 提供一种提高效率的方法,即在编译时将函数调用处用函数体替换,类似于C语言中的宏展开。这种在函数调用处直接嵌入函数体的函数称为内联函数(Inline Function),又称内嵌函数或者内置函数。

指定内联函数的方法很简单,只需要在函数定义处增加 inline 关键字。请看下面的例子:

#include <iostream>
using namespace std;//内联函数,交换两个数的值
inline void swap(int *a, int *b){int temp;temp = *a;*a = *b;*b = temp;
}int main(){int m, n;cin>>m>>n;cout<<m<<", "<<n<<endl;swap(&m, &n);cout<<m<<", "<<n<<endl;return 0;
}

运行结果:

42 85
85, 42
85, 42

注意,要在函数定义处添加 inline 关键字,在函数声明处添加 inline 关键字虽然没有错,但这种做法是无效的,编译器会忽略函数声明处的 inline 关键字。

当编译器遇到函数调用swap(&m, &n)时,会用 swap() 函数的代码替换swap(&m, &n),同时用实参代替形参。这样,程序第 16 行就被置换成:

int temp;
temp = *(&m);
*(&m) = *(&n);
*(&n) = temp;

编译器可能会将 (&m)、(&n) 分别优化为 m、n。

由于内联函数比较短小,我们通常的做法是省略函数原型,将整个函数定义(包括函数头和函数体)放在本应该提供函数原型的地方

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

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

相关文章

vc6.0mfc中单选按钮如何分组_按钮系列02-搞定按钮和选框的14个秘诀

UI 界面当中&#xff0c;各种开关、按钮、选框控件是非常常见的组件&#xff0c;它们看起来不复杂&#xff0c;但是在实际使用的时候讲究非常之多&#xff0c;它们不仅关乎体验&#xff0c;而且涉及到一些界面逻辑问题。英文中的 「Toggle」一词&#xff0c;对应的是带有短柄的…

C++函数的默认参数

在C中&#xff0c;定义函数时可以给形参指定一个默认的值&#xff0c;这样调用函数时如果没有给这个形参赋值&#xff08;没有对应的实参&#xff09;&#xff0c;那么就使用这个默认的值。也就是说&#xff0c;调用函数时可以省略有默认值的参数。如果用户指定了参数的值&…

python复制文件夹不阻塞_python学习笔记-(十四)I/O多路复用 阻塞、非阻塞、同步、异步...

1. 概念说明1.1 用户空间与内核空间现在操作系统都是采用虚拟存储器&#xff0c;那么对32位操作系统而言&#xff0c;它的寻址空间(虚拟存储空间)为4G(2的32次方)。操作系统的核心是内核&#xff0c;独立于普通的应用程序&#xff0c;可以访问受保护的内存空间&#xff0c;也有…

java某个类避免findbug检查_Findbug插件静态java代码扫描工具使用

本文转自http://blog.csdn.net/gaofuqi/article/details/22679609 感谢作者FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具。FindBugs通过检查类文件或 JAR文件&#xff0c;将字节码与一组缺陷模式进行对比从而发现代码缺陷&#xff0c;完成静态代码分析。FindBu…

Spring 是什么

Spring 是一个主流的 Java Web 开发框架&#xff0c;该框架是一个轻量级的应用框架&#xff0c;具有很高的凝聚力和吸引力。 Spring 是分层的 Java SE/EE full-stack 轻量级开源框架&#xff0c;以 IoC&#xff08;Inverse of Control&#xff0c;控制反转&#xff09;和 AOP&…

4乘4方格走的路线_苏州周边4个冷门自驾游路线景点推荐

1.崇明东滩崇明东滩湿地公园有两大看点&#xff0c;一是看候鸟迁徙&#xff0c;二是看日出和星空。东滩湿地滩涂辽阔&#xff0c;低头是大片的芦苇&#xff0c;抬头是满天斑斓的云彩&#xff0c;顺着木栈道走在公园内&#xff0c;如与大自然融为一体&#xff0c;可360度将美景收…

matlab程序转java_用面向对象的方法将一段JAVA代码转化为matlab

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼public class Variable {/*list of variables this variable is connected to. */ Vector neighbors;/* id of this variable */public int varID;/* id of agent this variable belongs to. */public int agentID;/** The domain …

Spring体系结构详解

Spring 框架采用分层架构&#xff0c;根据不同的功能被划分成了多个模块&#xff0c;这些模块大体可分为 Data Access/Integration、Web、AOP、Aspects、Messaging、Instrumentation、Core Container 和 Test。 Spring的体系结构如下图所示 图中包含了 Spring 框架的所有模块…

python时间戳是什么意思_Python-时间戳

# import time# 返回时间戳# print(time.time()) #返回时间戳# print(time.gmtime()) #返回utc时间戳# print(time.localtime(time.time()-86400)) #返回当地的时间戳# print(time.strftime("%Y-%m-%d",time.localtime())) #将struct_time转为字符串# print(time.mkt…

java对外查询接口注意的地方_Java接口注意点

1、接口可以多实现&#xff1a;一个实现类可以同时实现多个接口package com.qf.demo02_interface;//定义一种规则&#xff1a;interface A{public void testA();//public void fun();}//定义另一种规则interface B{public void testB();public void fun();}//实现类&#xff0c…

Spring目录结构和基础JAR包介绍

目前 Spring 框架的最新版本是 5.1.8&#xff0c;本教程是基于 Spring 的稳定版本 3.2.13 进行讲解的。读者可以通过网址 http://repo.spring.io/simple/libs-release-local/org/springframework/spring/ 下载名称为 springframework-3.2.13.RELEASE-dist.zip 的压缩包。单击此…

自定义依赖注解无效_SpringValidation用注解代替代码参数校验解析

Spring Validation概念在原先的编码中&#xff0c;我们如果要验证前端传递的参数&#xff0c;一般是在接受到传递过来的参数后&#xff0c;手动在代码中做 if-else 判断&#xff0c;这种编码方式会带来大量冗余代码&#xff0c;十分的不优雅。因此&#xff0c;推出了用注解的方…

mysql开源许可_为什么开源数据库改变许可证?

CockroachDB 是一个开源的分布式数据库&#xff0c;最近改变了代码授权&#xff0c;放弃了 Apache 许可证。一、CockroachDB 的许可证变更CockroachDB 以前的许可证是 Apache&#xff0c;代码托管在 GitHub&#xff0c;任何人都可以访问。现在的许可证改成了"商业源码许可…

Spring IoC容器

我们将详细介绍 Spring 的 Ioc 容器。 IoC 是指在程序开发中&#xff0c;实例的创建不再由调用者管理&#xff0c;而是由 Spring 容器创建。Spring 容器会负责控制程序之间的关系&#xff0c;而不是由程序代码直接控制&#xff0c;因此&#xff0c;控制权由程序代码转移到了 S…

python相同怎么写_这两个index相同的dataframe我想把他们merge,怎么写?

能具体点么&#xff1f;这是这两df的代码# -*- coding: utf-8 -*-import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport tracebackfrom tools import *import matplotlib as mplimport pickleimport datetime as dtdf1 pd.DataFrame({A0: [A0, A1, …

python里删除range里的数字_python中range函数与列表中删除元素

一、range函数使用range(1,5) 代表从1到4(不包含5)&#xff0c;结果为&#xff1a;1,2,3,4 &#xff0c;默认步长为1range(1,5,2) 结果为&#xff1a;1, 3 (同样不包含5) &#xff0c;步长为2range(5,-1,-1) 反向输出&#xff0c;结果为&#xff1a;5,4,3,2,1,0 &#…

python中print又可将数据写入文件_Python第五课-将写入文件的列表格式化

1、上节课代码中的问题 第四课中介绍了python持久化的基础实例——将数据写入文本文件。 可当我们试着把保存数据的文件读取出来会怎样呢&#xff1f; try: with open(man.txt, r) as fman: print(fman.readline())except IOError as err: print(str(err)) 执行时&#xff0c;1…

Spring 依赖注入的实现

依赖注入&#xff08;Dependency Injection&#xff0c;DI&#xff09;和控制反转含义相同&#xff0c;它们是从两个角度描述的同一个概念。 当某个 Java 实例需要另一个 Java 实例时&#xff0c;传统的方法是由调用者创建被调用者的实例&#xff08;例如&#xff0c;使用 new…

arduino倾斜开关python语言_Arduino小白的学习记录:倾斜开关实验

一、介绍带有金属球的球形倾斜开关&#xff0c;它用于检测小角度的倾斜。图7.1 倾斜开关模块二、材料准备Arduino Uno 主板*1USB数据线*1倾斜开关模块*1杜邦线若干三、实验原理在倾斜开关中小球以不同的倾斜角度移动以造成触发电路的原理。倾斜开关模块使用双向传导的球形倾斜开…

Spring Bean的配置及常用属性

作为 Spring 核心机制的依赖注入&#xff0c;改变了传统的编程习惯&#xff0c;对组件的实例化不再由应用程序完成&#xff0c;转而交由 Spring 容器完成&#xff0c;在需要时注入应用程序中&#xff0c;从而对组件之间依赖关系进行了解耦。这一切都离不开 Spring 配置文件中使…