【高质量C++/C总结2】函数内联inline

VTK四视图联动避坑指南:解决vtkImagePlaneWidget窗宽窗位同步与切片序号更新的那些坑 本文详细解析了VTK四视图联动开发中的关键技术点与常见问题,包括切片位置同步、窗宽窗位同步的实现原理及回调机制设计。针对开发中遇到的回调事件不触发、渲染性能低下等问题,提供了实用的解决方案和优化技巧,帮助开发者高效构建医学影像和科学可视化应用。 阅读详情

说在开始:

作者:尹豆(憨豆酒),联系我yindou97@163.com,熟悉图形学,图像处理领域,本章代码: https://github.com/douysu/computer-graphics-notes

我提炼了《C++ Primer》、《侯捷C++》、《高质量程序设计指南——C/C++语言》等资料中的重要部分,并总结成此博文。其中涉及到许多我个人对C++的理解,如若有不合理之处,还请朋友们多多指出,我会虚心接受每一个建议。

内联函数inline

内联函数的实际目的是为了提高函数的执行效率,在条件允许的情况下,编译器会自动将内联函数中的代码直接替换函数调用语句,可以帮助减少函数调用开销:参数压栈、跳转、退栈、返回值等,提高了代码的执行速度。
此案例说明了这个问题。

int sumFunc(int x,int y);
inline int sumFunc(int x,int y)
{
	return (x+y);
}
int main()
{
	int sumV=sumFunc(2,3);
	return 0;
}
//被扩展成代码
int main()
{
	int sumV = 2+3;
	return 0;
}

内联函数inline的使用频率

为了查看inline在实际开发中的使用频率,我查阅了一些C++开源项目,发现inline的使用频率是非常高的,例如C++ STL algorithm中的max函数的源码,可以非常清楚的看到设计algorithm的人使用了inline。

ntemplate<typename _Tp>
_GLIBCXX14_CONSTEXPR
inline const _Tp&
max(const _Tp& __a, const _Tp& __b)
{
  // concept requirements
  __glibcxx_function_requires(_LessThanComparableConcept<_Tp>)
  //return  __a < __b ? __b : __a;
  if (__a < __b)
return __b;
  return __a;
}

使用内联函数inline的注意事项

()内联函数的代码不应过长。内联函数是以代码拷贝为代价的,仅仅省去的函数调用的开销。试想,如果你的方法中的代码执行时间比函数调用过程花费的时间还长,那就没有必要在使用内联函数了。当然,函数体内出现多次循环或者其他复杂的结构:递归、排序、遍历等等,那内联函数意义也是微乎其微的。例如,这样的方法。

void funC(){
    for(int i=0;i<=20;i++)
        for(......)
            for(......)
}

(2)计算函数(代码长度较短)更加适合内联。例如计算圆的面积,圆的半径,min,max,sum,average等等,当在项目封装库的过程中,记得使用内联。当然C++设计师也是这样做的,例如min,max。

(3)inline必须与函数定义放在一起才会起作用。在C++中,有一非常重要的理念,函数的声明和定义是两大部分。通常函数的声明会放在头文件.h中,而函数的定义会放在可编译单元.cpp中。 在使用其他人写好的类时,只需要include相应的头文件,使用者无需关心该函数是否为内联函数,例如使用algorithm中的min函数一样,我们无需知道此函数是否为内联函数。

(4)在哪个cpp中定义内联,就只能在该cpp中使用。例如

//InlineSample.h
#ifndef NEILIANSAMPLE_H
#define NEILIANSAMPLE_H
class InlineSample
{
public:
	InlineSample();
	void setValue(float inValue);
	float value;
};
#endif

//InlineSample.cpp
#include "InlineSample.h"
InlineSample::InlineSample() {
}
inline void InlineSample::setValue(float inValue) {
	value = inValue;
} 

//main.cpp
#include "InlineSample.h"
#include<iostream>
using namespace std;
int main() {
	InlineSample ns;
	ns.setValue(2.0f);
	printf("当前的值%f", ns.value);
	cin.get();
}

此种情况会编译错误,因为在InlineSample.cpp中定义的inline,却想要在main.cpp中使用,显然是错误的。这也是我自己在开发中遇到的问题,需要注意。此时应将setValue方法的定义放到.h文件中,即可完成这种需求。

//InlineSample.h
#ifndef NEILIANSAMPLE_H
#define NEILIANSAMPLE_H
class InlineSample
{
public:
	InlineSample();
	void setValue(float inValue);
	float value;
};
inline void InlineSample::setValue(float inValue) {
	value = inValue;
}
#endif 

这种方式的实现原理:当include头文件InlineSample.h时,就将inline的定义代码拷贝到了相应的cpp,这样当然不会出现问题了,但是这与(3)中的说法好像有点相违背,看大家怎么选择了。

(5)inline在实现过程中并不是绝对的,其只是对编译器提出一个请求,编译器有完全的权利决定该函数是否被内联。如果此函数被内联对性能没有提升,那么就不会被编译器采纳。

别再翻手册了!用Materials Studio的Forcite模块,5步搞定复杂溶剂的溶解度参数计算 本文详细介绍了如何使用Materials Studio的Forcite模块,通过5个步骤快速计算复杂溶剂的溶解度参数。从分子建模、结构优化到分子动力学采样,再到最终的内聚能密度计算,该方法大幅提升了石油化工和高分子材料研发中的效率,避免了传统手册查阅和实验的繁琐过程。 阅读详情

相关推荐

数据安全实战技能解析:从加密攻防到数字水印的竞赛指南

数据安全是信息安全领域的核心,其基础在于密码学与信息隐藏技术。密码学通过加密算法(如AES、RSA)和哈希函数,保障数据的机密性与完整性,其原理涉及对称/非对称加密、工作模式及密钥管理。数字水印技术则基于信号处理(如DCT/DWT变换),将信息嵌入多媒体载体,用于版权保护与溯源。这些技术的价值在于为数据全生命周期提供“防泄漏”与“可追溯”的解决方案,广泛应用于企业数据治理、合规审计和**数据防泄漏(DLP)** 系统。本文以一场贴近实战的**数据安全职业技能竞赛**为切入点,深入剖析如何运用密码分析、磁盘取

weixin_34314962的博客 402

【C++】inline float& operator[](unsigned int i); 中float& operator[]的意思

operator[]这是个[]运算符函数,有这个函数的类的对象可以像数组那样使用方括号运算符,前面的float&amp;表示这个运算的结果返回的是一个float类型的变量的引用。 一般在把数组封装成一个类的时候才使用这个。 class A{ float arr[10]; public: inline float&amp; operator[](unsigned int i){return arr[...

weixin_42425594的博客 907

汽车软件工程师必看:ASPICE流程实战指南(附完整产物清单)

本文为汽车软件工程师提供ASPICE流程实战指南,详细解析如何搭建合规开发环境、各阶段文档产出清单及工具链整合策略。通过实战案例和模板资源,帮助团队高效实施ASPICE标准,提升软件开发质量与效率。

weixin_29230805的博客 468

问题四:C++中inline是干嘛用的

iInline:若一个函数被指定为inline函数,则它将在程序中每个调用点上被内联地展开。一般来说,内联函数不会引入任何函数调用。所以可以提高执行效率。 注意,函数home() 、get() 、height()和width()的定义是在类体内提供的。这些函数被称为“在类定义中定义的内联(inline)函数”。这些函数被自动作为inline函数处理。 我们也可以通过在成员函数的返回类型前显式地

图形跟班 2560

hcaptcha-challenger:基于本地AI模型自动破解验证码的工程实践

验证码作为区分人类与机器的经典安全机制,其核心原理是通过图像识别、行为分析等交互式挑战来阻挡自动化程序。传统绕过方法依赖第三方打码平台或脚本,存在成本高、稳定性差的问题。随着多模态大语言模型和计算机视觉技术的发展,本地化AI求解成为新的技术方向,它通过集成YOLO、ResNet等模型,在本地完成图像语义理解,实现了高隐私、低成本、可进化的验证码自动化解决方案。这种范式尤其适用于需要大规模稳定处理网页交互的场景,如电商数据采集和社交媒体管理。hcaptcha-challenger项目正是这一理念的工程实践,它

weixin_42587866的博客 1025

避开生产计划大坑:不懂MPS和MRP的区别,你的SAP PP模块白学了

本文深入解析SAP PP模块中MPS(主生产计划)与MRP(物料需求计划)的核心区别,揭示如何通过正确配置避免生产计划中的常见陷阱。文章详细探讨了MPS的三大缓冲特性和动态平衡算法,帮助企业提升生产计划稳定性,优化资源配置,避免生产线波动。

weixin_29268267的博客 401

c语言 inline函数的总结,C++中inline函数详解

本文主要记录了C++中的inline函数,也就是内联函数,主要记录了以下几个问题:一、C++为什么引入inline函数?主要目的:用它代替C语言中表达式形式的宏定义来解决程序中函数调用的效率问题。C语言中的宏定义:#define ExpressionName(var1,var2) (var1+var2)*(var1-var2)这种宏定义,它使用预处理器实现,没有了参数压栈、代码生成等一系列得到操作...

weixin_42498643的博客 3506

T265摄像头插着开机后,需要重新插拔才能正常启动

T265摄像头插着开机后,需要重新插拔才能正常启动

qq_35598561的博客 1077

C++基础:inline函数

1.inline 函数 1.1定义:inline 函数由 inline 关键字定义,引入 inline 函数的主要原因是用它替代 C 中复杂易错不易维护的宏函数。 1.2编译器对 inline 函数的处理办法 编译器在编译阶段完成对 inline 函数的处理,即对 inline 函数的调用替换为函数的本体。但 inline 关键字对编译器只是一种建议,编译器可以这样去做,也可以不去做。从逻辑上来说,编译器对 inline 函数的处理步骤一般如下: (1)将 inline 函数体复制到inline..

weixin_58368590的博客 1万+

GEE APP:基于GEE的红树林监测平台

本文将介绍如何利用Google Earth Engine平台,结合Landsat系列卫星影像和SRTM高程数据,实现红树林分布的动态监测与变化分析。

此星光明博客 159

让 ABAP 开发者也能做出高质量 SAP Fiori:到底需要掌握多少前端知识?

文章摘要: 随着SAP技术演进,ABAP开发者的角色边界正在重构。传统SAP GUI时代的全栈开发模式逐渐转向RAP+Fiori Elements的新范式,其中关键技术变化包括: 开发模式转变:从前后端耦合转向RAP模型驱动开发,通过CDS注解实现UI意图表达 分工优化:Fiori Elements模板处理80%标准UI需求,Flexible Programming Model解决20%差异化需求 效率提升:注解驱动开发可在RAP建模阶段同步定义UI结构,大幅缩短交付周期 工具整合:SAP提供从建模到部署的

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 348

C++ inline 函数

inline 函数由 inline 关键字定义,引入 inline 函数的主要原因是用它替代 C 中复杂易错、不易维护的宏函数。

Doublelv 的博客专栏。 4万+

备战2025数学建模国赛(算法65):Fisher判别分析

在数学建模竞赛中,我们常常会遇到需要对研究对象进行分类或判断的问题。例如,根据西瓜的各类指标判断其好坏,根据经济数据判断一个国家的发展程度,或根据病人的医学影像特征判断其是否患病。这类“分类判别”问题,是建模竞赛中最常见的题型之一。Fisher判别分析(或称线性判别分析,LDA)作为一种经典的、有监督的降维与分类方法,因其模型简洁、可解释性强、计算高效而备受青睐。

YOLO 421

内联函数-C中关键字inline用法解析

目录 内联函数-C中关键字inline用法解析 内联函数-C中关键字inline用法解析 一、什么是内联函数 ​ 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。 ​ 为了解决这个问题,特别的引入...

测试 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

内联函数 —— C 中关键字 inline 用法解析

一、什么是内联函数        在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗,为了解决,特别的引入了inline修饰符,表示为内联函数。        栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空

知秋一叶 15万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

inline函数的总结

如果内联函数不能增强性能,就避免使用它!

不积跬步无以至千里 5万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

内联函数 —— C 中关键字 inline 用法解析(转载)

一、什么是内联函数 在C语言中,如果一些函数被频繁调用,不断地有函数入栈,即函数栈,会造成栈空间或栈内存的大量消耗。 为了解决这个问题,特别的引入了inline修饰符,表示为内联函数。 栈空间就是指放置程式的局部数据也就是函数内数据的内存空间,在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足所造成的程式出错的问题,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。 下面我们来看...

Eureka1024的博客 4712

【C语言】内联函数(inline)用法解析

介绍inline内联函数的定义,使用和注意事项等知识

Sudley的博客 5577

【C语言】 inline 关键字--内联函数

因此,将内联函数放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦.而所以声明跟定义要一致,其实是指,如果在每个文件里都实现一次该内联函数的话,那么,最好保证每个定义都是一样的,否则,将会引起未定义的行为,即是说,如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定.所以,最好将内联函数定义放在头文件中。inline只适合涵数体内代码简单的函数数使用,不能包含复杂的结构控制语句例如while、switch,并且内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。

ffffffeiyu的博客 862

inline的作用

1、引入 inline 关键字的原因 在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数。inline 只适合涵数体内代码简单的涵数使用,不能包含复杂的结构控制语句例如 while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。 #include <stdio.h> inline const char *num_check(int v) { return (v

天之彼方的博客 1万+

C语言 inline 关键字--内联函数

因此,将内联函数放在头文件里实现是合适的,省却你为每个文件实现一次的麻烦.而所以声明跟定义要一致,其实是指,如果在每个文件里都实现一次该内联函数的话,那么,最好保证每个定义都是一样的,否则,将会引起未定义的行为,即是说,如果不是每个文件里的定义都一样,那么,编译器展开的是哪一个,那要看具体的编译器而定.所以,最好将内联函数定义放在头文件中.inline只适合涵数体内代码简单的函数数使用,不能包含复杂的结构控制语句例如while、switch,并且内联函数本身不能是直接递归函数(自己内部还调用自己的函数)。

ffffffeiyu的博客 964

inline内联函数(声明前加inline还是定义前加inline)

inline

holly的专栏 1万+

C++中的内联函数inline总结

突然看到C++Primer中讲到,对于vector的一个循环,调用语句:(示例代码i=v.begin()不是很规范,虽然不会出错,客官请将就着看) for (int i=v.begin() ; i<v.size() ; i++) { .... }       对于size()

coder_xia的专栏 3万+

C++之inline的使用

inline的使用一.普通函数inline1.关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。2.把内联函数的定义放在头文件中二.类的成员函数inline类的构造函数,析构函数的inline 首先,明白一点:不是你指定函数inline就inline,关键看编译器是否认可。我们使用inline关键字指定inline函数仅仅是向编译器提的请求,编译器完全可以忽略这个请求。 其次,inline机制一般用于规模较小(可理解为行数少)、流程直接(可理解

weixin_43744293的博客 5143
上一篇: 【高质量C++/C总结1】高级数据类型枚举Enum
下一篇: 【Shader编程】移动光带的开发
尹豆(douysu)
博客等级 码龄9年 151粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值