C++成员函数内联(inline)

        内联函数是C++为提高程序运行速度所做的一项改进。常规函数和内联函数之间的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中。
        当程序执行函数调用时,系统要为即将调用的函数创建栈空间(栈帧),保存现在正在执行的函数数据(保护现场),传递参数以及控制程序执行的跳转等操作,当调用的函数执行完成后又需要跳到当前函数并恢复现在的数据(恢复现场),然后继续执行,这些操作都需要时间和空间开销。
        C++内联(inline)函数提供了另一种选择,对于内联函数编译器将用函数代码替换函数调用,这样程序就无需跳到另一个函数执行,执行完后再跳回来。因此内联函数的运行速度比常规函数稍快。
        例如:求两个数的最大值。

#include <iostream>
using namespace std;

inline int max(int x,int y) //定义内联函数
{
    return x>y?x:y;
}

int main()
{
    int z1,z2,z3;
    z1=max(10,20); //调用函数,在编译时进行代码替换
    z2=max(20,50); //调用函数,在编译时进行代码替换
    z3=max(z1,z2);//调用函数,在编译时进行代码替换
    cout<<"z1="<<z1<<endl;
    cout<<"z2="<<z2<<endl;
    cout<<"z3="<<z3<<endl;
    return 0;
}

上面程序中,main()函数3次调用了内联函数max(),将在编译过程中展开类似下面的形式:

int z1=10>20?10:20;
int z2=20>50?20:50;
int z3=z1>z2?z1:z2;

程序员请求将函数作为内联函数时,编译器不一定满足这种要求。内联inline只是对编译器提出建议,而有的编译器没有启用或者实现这种特性。一般 内联函数应该满足下面的要求:
●函数不能出现循环;
●函数代码不超过三行。

类中的内联函数

        内联函数主要的应用场景就是类。如果类的成员函数非常简单(不超过三行代码),可以将成员函数定义在类中,这时该函数自动成为内联函数,如果成员函数较复杂(超过三行),则在类中声明成员函数,而在类外定义。

内联和宏

inline是C++新增的特性。C语言使用预处理语句#define来实现宏。宏最常用的功能是让数字有自己的名字。而不是让它做函数该做的事情。下面是一个计算平方的宏:

#define SQUARE(x) x*x

宏仅仅是字符替换。下面的语句执行结果可能和你想的并不一样。

int a = 1;
int b = SQUARE(2+3);//被替换成 int b=2+3*2+3 ;
int c = SQUARE(++a);//被替换成 int c=++a*++a ;这个a被++两次

这里的目的不是演示如何编写宏,而是要指出,C语言中的宏仅仅只是字符替换,如果要让宏执行类似函数的功能,请考虑把它改为内联函数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何远程连接办公室电脑?

远程办公成为了现代工作生活的一部分&#xff0c;特别是在面对突如其来的疫情时&#xff0c;远程连接办公室电脑成为了一种常见的解决方案。通过远程连接&#xff0c;员工可以在不在办公室的情况下&#xff0c;直接访问办公室电脑上的文件和应用程序&#xff0c;实现远程协作和…

UE5(射线检测)学习笔记

这一篇会讲解射线检测点击事件、离开悬停、进入悬停事件的检测&#xff0c;以及关闭射线检测的事件&#xff0c;和射线检测蓝图的基础讲解。 创建一个简单的第三人称模板 创建一个射线检测的文件夹RadiationInspection&#xff0c;并且右键蓝图-场景组件-命名为BPC_Radiation…

阅读欣赏推荐之(六)——纪录片《阿基米德的秘密》

阿基米德是古希腊物理学家、数学家&#xff0c;静力学和流体静力学的奠基人。有人评价说除了伟大的牛顿和伟大的爱因斯坦&#xff0c;再没有一个人像阿基米德那样为人类的进步做出过这样大的贡献。即使是牛顿和爱因斯坦&#xff0c;也都曾从他身上汲取过智慧和灵感。他是“理论…

[暂未实现]APP签名不同保留数据覆盖安装记录

APP签名不同无法直接覆盖安装 使用adb可以卸载应用同时保留数据&#xff0c;但签名不同也无法覆盖安装&#xff08;安装原来签名的应用打开和卸载前一样&#xff09; 使用adb导出应用数据&#xff08;QQ&#xff09;db文件只有1kb&#xff0c;显然此方法也行不通

FreeBSD下安装Linux兼容系统Ubuntu

FreeBSD有个很神奇的功能&#xff0c;就是跟Linux二进制兼容&#xff0c;也就是可以直接运行linux的bin文件。还有个更神奇的功能&#xff0c;就是能运行出一套Linux系统&#xff0c;完全是linux的用户&#xff0c;linux的目录系统&#xff0c;而且还可以选是Centos系统还是Ubu…

在离线环境中将运行 Oracle DB 12c 的 CentOS 7.5 原地升级并迁移至 RHEL 7.9

《OpenShift / RHEL / DevSecOps 汇总目录》 说明 本文只是说明如何在 CentOS 7.5 上准备 Oracle DB 12c 验证环境&#xff0c;而将该环境升级并迁移至 RHEL 7.9 的操作过程请参见&#xff1a;《在离线环境中将 CentOS 7.5 原地升级并迁移至 RHEL 7.9》一文。 另外&#xff…

DEM(高程)数据下载及计算可见性

数据下载 下载链接: 地理空间数据云 (gscloud.cn) 数据部分介绍 ASTER是美国宇航局Terra航天器(1999年发射)上的五台仪器之一,在日本为经济产业省(METI)建造。美国/日本联合科学团队负责仪器设计、校准和数据验证。 高级星载热发射和反射辐射计(ASTER)全球数字高程…

Android BINDER是干嘛的?

1.系统架构 2.binder 源码位置&#xff1a; 与LINUX传统IPC对比

【c++设计模式15】结构型7:代理模式(Proxy Pattern)

【c设计模式15】结构型7&#xff1a;代理模式&#xff08;Proxy Pattern&#xff09; 一、定义二、适用场景三、过程四、代理模式类图五、C示例代码六、使用注意事项七、结论 类型序号设计模式描述结构型1适配器模式&#xff08;Adapter Pattern&#xff09;它用于在不修改已有…

一次完整的 http 请求是怎样的?

一次完整的 http 请求是怎样的&#xff1f; &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 域名解析 --> 发起 TCP 的 3 次握手 --> 建立 TCP 连接后发起 http 请求 --> 服务器响应 http 请求&#xff0c;浏览器得到 html 代码 --…

Activating More Pixels in Image Super-Resolution Transformer

cvpr2023https://github.com/XPixelGroup/HAT?tabreadme-ov-file问题引入&#xff1a; – 现在的transformer based的SR模型“感受野”不够&#xff1b; – 分析&#xff1a;原本认为transformer-based的方法优于CNN-based的方法是因为可以利用更加long-range的信息&#xff0…

MySql数据库(概念篇)

数据库概念 什么是数据库 数据库见名之意&#xff0c;就是用来存储数据的仓库&#xff0c;是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合。 没接触数据库之前&#xff0c;一般都是将数据存储在文件中。比如execl文件&#xff0c;word文件中。但是…

基于 Dockerfile 部署 LNMP 架构

目录 前言 1、任务要求 2、Nginx 镜像创建 2.1 建立工作目录并上传相关安装包 2.2 编写 Nginx Dockerfile 脚本 2.3 准备 nginx.conf 配置文件 2.4 生成镜像 2.5 创建 Nginx 镜像的容器 2.6 验证nginx 3、Mysql 镜像创建 3.1 建立工作目录并上传相关安装包 3.2 编写…

flink sql 优化

文章目录 一、参数方面二、资源方面三、总结 提示&#xff1a;实时flink sql 参考很多网上方法与自己实践方法汇总(版本:flink1.13) 一、参数方面 flink sql参数配置 //关闭详细算子链(默认为true),true后job性能会略微有提升。false则可以展示更详细的DAG图方便地位性能结点…

4. HBuilderX中的插件商城

前言 在HBuilderX中有一个插件市场&#xff0c;这个和VSCode的插件库不太像&#xff0c;硬要做个简单类比的话&#xff0c;个人认为HBuilderX中的插件市场更像是npm库&#xff0c;它里面有许多其他开发者开发的插件&#xff0c;这些插件更多的是为uniapp服务的&#xff0c;比如…

第23章 微内核架构软件测试(下午题)

一、微内核架构概述 &#xff08;一&#xff09;概念 1、微内核架构 微内核&#xff1a;精简的内核 宏内核&#xff1a;中央集权控制中心 核心系统 能运行的最小模块插件模块 专业处理&#xff0c;额外特性的独立组件增加/扩展核心系统的业务逻辑能力连接方式 OSGI、消息机…

springAI框架学习总结

springAI 1.springAI基本介绍 springAI是一个AI工程应用框架&#xff0c;其目标是将 Spring 生态系统设计原则&#xff08;例如可移植性和模块化设计&#xff09;应用于 AI 领域&#xff0c;并推广使用 POJO 作为 AI 领域应用程序的构建块。 2.特性 灵活的AIP支持chat,text…

WPF之绑定属性值转换

1&#xff0c;使用Binding.Format属性简易设置绑定的属性数据显示格式。 <TextBox Grid.Row"2" Grid.Column"1"><TextBox.Text><Binding Path"UnitCost" StringFormat"{}{0:C3}" > …

[论文笔记]Longformer: The Long-Document Transformer

引言 今天带来论文Longformer: The Long-Document Transformer的笔记。 基于Transformer的模型由于其自注意力操作而无法处理长序列&#xff0c;该操作随着序列长度呈二次扩展。为了解决这一限制&#xff0c;本篇工作提出了Longformer&#xff0c;其注意力机制随着序列长度呈…

Edge扩展应用程序的上架流程

前言 在软件开发的生命周期中&#xff0c;发布流程是将产品推向市场并交付给用户的关键阶段。它不仅标志着一个项目从开发阶段到用户手中的转变&#xff0c;也是确保软件质量和用户体验的重要环节。那么一个清晰、高效且可重复的发布流程对于任何软件项目的成功至关重要&#…
最新文章