[Effective C++]条款30:透彻了解inlining的里里外外

Effective C++ 条款30:透彻了解 inlining 的里里外外 深入解析 Effective C++ 条款30:透彻了解 inlining 的里里外外,分析 inline 关键字的本质、编译器决策机制、代码膨胀问题及最佳实践。 阅读详情

.
1、内联函数

  • inline内联函数的设计是为了消除函数调用的开销,在编译期间由编译器将函数体插入到每个调用点,来避免常规函数调用时的压栈、跳转和返回等操作,减少函数调用的时间开销。

1.1、内联函数作用

  • 减少函数调用开销: 消除函数调用时的函数传递,控制权转移等开销
  • 提高程序执行效率:特别适合小型、频繁调用的函数
  • 保持代码结构化:即获得了宏替换的性能优势,又保持了函数的机构化特性

2、内联函数的使用
2.1、普通使用

#include <iostream>

// 内联函数声明
inline int max(int a, int b) {
    return a > b ? a : b;
}

int main() {
    int x = 10, y = 20;
    
    // 调用内联函数 - 编译器可能会直接替换为 return x > y ? x : y;
    std::cout << "Max is: " << max(x, y) << std::endl;
    
    return 0;
}

2.2、类成员内联函数

  • 类的成员函数是隐式内联函数,在类定义中自动转换内联函数
#include <iostream>

class Circle {
private:
    double radius;
    
public:
    // 隐式内联:在类定义中直接实现的成员函数自动为内联
    void setRadius(double r) { 
        radius = r; 
    }
    
    // 显式内联
    inline double getArea() const;
};

// 类外定义的成员函数也可以内联
inline double Circle::getArea() const {
    return 3.14159 * radius * radius;
}

int main() {
    Circle c;
    c.setRadius(5.0);
    std::cout << "Area: " << c.getArea() << std::endl;
    return 0;
}

2.3、内联函数与模板

#include <iostream>

// 模板函数通常与inline一起在头文件中定义
template <typename T>
inline T square(T x) {
    return x * x;
}

int main() {
    std::cout << "Square of 5: " << square(5) << std::endl;
    std::cout << "Square of 3.14: " << square(3.14) << std::endl;
    return 0;
}

2.4、不适合内联的情况

#include <iostream>

// 不适合内联的函数示例:函数体较大且复杂
inline void processData(int* data, int size) {
    // 复杂处理逻辑
    for (int i = 0; i < size; ++i) {
        data[i] = data[i] * 2 + 10;
        if (data[i] > 100) {
            data[i] = 100;
        }
        // 更多复杂操作...
    }
    // 更多代码...
}

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    processData(arr, 5);  // 这种函数不适合内联
    
    for (int i = 0; i < 5; ++i) {
        std::cout << arr[i] << " ";
    }
    return 0;
}

思维导图笔记:
请添加图片描述

手把手教你用LaTeX完成Elsevier期刊投稿:附完整文件上传清单与注意事项 本文提供了一份详尽的Elsevier期刊LaTeX投稿实战指南。文章系统拆解了从稿件准备、文件上传到最终提交的全流程,重点解析了Manuscript、Figure(s)等关键文件的上传逻辑与注意事项,并附有PDF生成前后的详细检查清单,旨在帮助研究者高效、规范地完成投稿,规避常见错误。 阅读详情

相关推荐

从梯度泄露到数据复原:DLG与iDLG算法实战解析

本文深入解析了DLG与iDLG算法在梯度泄露与数据复原中的实战应用,揭示了联邦学习中的隐私风险。通过详细代码示例和实验数据,展示了如何从梯度中复原原始训练数据,并探讨了梯度压缩、差分隐私等防御措施。文章特别强调了iDLG算法在标签破解中的高效性,为AI安全领域提供了重要参考。

weixin_30552811的博客 191

C++经验(十一)-- (inlining)内联函数的使用

编写代码过程中使用函数,能够降低代码的重复率,特别是在一些重复性比较高的代码中,也能够用降低运行程序的体积。但不可避免的也会带来一些程序运行上的时间消耗。函数执行的时候,首先要在栈上为形参和局部变量申请内存,同时也要将实参的值复制给形参,最后还需要将函数的返回地址写入栈,以便函数结束运行后,程序能够知道应该回到哪儿继续执行。最后才跳转到函数内部进行执行。执行完还要进行内存的析构等资源的回收。.........

slowlytalk 1194

CANOCO5.0实现冗余分析(RDA)最详细步骤

在地理及生态领域会常使用RDA分析,RDA的实现路径也有很多,今天介绍一下CANOCO软件的实现方法。1.不同样点和环境因子之间夹角是锐角 是正相关,是钝角是负相关。2.夹角越大 说明相关性较小,夹角越小,相关性越大。得有不同的物种或者样点数值,再加上环境因子数据。3.箭头越长 相关性越大。时间调整到2010年。

Along6的博客 1万+

C++中的inline用法

  1 引入inline关键字的原因 在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数,栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。   下面我们来看一个...

一个人的旅行的博客 3万+

Python自动化:3分钟搞定微信收藏链接批量导出到TXT(附完整代码)

本文介绍如何使用Python自动化工具在3分钟内将微信收藏链接批量导出到TXT文件。通过模拟人类操作和OCR技术,脚本高效处理大量链接,显著提升工作效率,并附有完整代码和实战避坑指南。

weixin_29062671的博客 630

SpyGlass Lint脚本实战:如何用TCL自动化RTL代码检查(附完整配置模板)

本文详细介绍了如何利用TCL脚本实现SpyGlass Lint工具的自动化RTL代码检查。通过构建模块化、工程化的脚本框架,文章提供了从环境搭建、核心配置、规则定制到豁免管理的完整实战指南,并附有可复用的配置模板,旨在帮助IC设计工程师构建高效、一致的代码质量检查流水线。

weixin_29204205的博客 134

inline

一、inline 关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。   表达式形式的宏定义一例:   #define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2))

ty616114553的专栏 483

西工大noj100题python2024第三季21-30

【代码】西工大noj100题python2024第三季21-30。

weixin_70523540的博客 1577

C++笔记 30:透彻的了解inlining

Effective C++笔记 Understand the ins and outs of inlining inline只是对编译器的一个申请 inline大多数在编译过程中进行inlining template的具现化与inlining无关 virtual函数的调用会使inlining落空 编译器通常不对"通过函数指针而进行的调用"实施inlining inline函数无法随着程序库的升级而升级 调试 总结 ...

qq_36333986的博客 574

手把手教你学simulink实例--基于Simulink的船舶动力定位系统建模与仿真

船舶动力定位系统(Dynamic Positioning System, DPS)是一种通过控制推进器来保持船舶在指定位置和航向的技术。它广泛应用于海上钻井平台、海洋调查船、起重船等需要精确位置控制的场景。DPS的核心任务是实时感知环境干扰(如风、浪、流),并通过闭环控制算法调整推进器输出,以抵消外界扰动并维持船舶的位置和姿态。本项目旨在基于MATLAB/Simulink平台,构建船舶动力定位系统的数学模型,并进行仿真分析,验证其性能和稳定性。

MHD0815的博客 1083

模式分类识别 | TCN时间卷积神经网络多特征分类预测(Matlab完整程序)

模式分类识别 | TCN时间卷积神经网络多特征分类预测(Matlab完整程序)

前程算法屋的博客 748

python:collections

inline C/C++编程:C语言中的内联函数 优缺点 inline函数的优点: 功能像函数,但是免除了”函数调用的成本“ 编译器最优化机制常常被设计用于那些"不含函数调用"的代码,所以inline某个函数,编译器可能对此执行相关语境的最优化 inline函数的缺点: inline函数背后的整体观念是:将"对此函数的每一个调用"都以函数本体替换之。这可能增加你的目标码的大小,造成函数体积太大。即使有虚拟内存,inline造成的代码膨胀也会导致额外的换页行为,降低指令高速缓存装置的击中率,从而导致效率

OceanStar的博客 250

ardupilot开发 --- mavlink签名加密 篇

ardupilot开发 --- mavlink签名加密

记录老板的每次pua,分享领导每天的毒鸡汤... 1236

Effective C++条款30:透彻了解inlining的里里外外

inline函数,可以调用它又不需要承受调用函数调用索导致的额外开销。此外,编译器最优化机制通常被设计用来浓缩那些不含函数调用的代码,所有当你inline某个函数,或许编译器就因此有能力对它进行最优化。 当然有利于也有弊:inline函数背后的原理是:对此函数的每一个调用都以函数本体替换之,显而易见的是,这样做很有可能增加你的目标代码大小。在一台内存有限的机器上,过度使用inline会导致程序体积...

qq_44800780的博客 260

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Effective C++ 条款30 透彻了解inlining的里里外外

1.inline 的优缺点 > 优点 ——看起来像函数 ——动作像函数 ——比宏好很多 ——可以调用它们又不需要蒙受函数调用所招致的额外开销 ——编译器最优化机制通常被设计用来浓缩那些“不含函数调用”的代码,所以当你inline某个函数,或许编译器就因此——有能力对它(函数本体)执行预警相关最优化。大部分的编译器不会对一个“outlined函数调用”动作执行如此之最优化 > 缺点 ——可能增加目标码(object code)的大小 ——inline造成的代码膨胀会导致额外的换页行为,降低指令告诉

qq_18059143的博客 312

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Effective C++条款30:实现——透彻了解inlining的里里外外

一、inline的优缺点 优点 免除函数调用成本 缺点 以函数本体代替函数调用,因此目标码增大 在一台内存优先的机器上,过度使用inline会造成程序体积太大 即使拥有虚内存,inline造成的代码膨胀也会造成额外的换页行为,降低指令高速缓存装置的集中率,以及伴随效率的损失 二、隐式内联、显式内联 inline只是对编译器的一个申请,不是强制命令 隐式内联:当成员函数定义在类的内部时,这个函数是隐式inline的(隐式内联只有这一种情况)。例如: class Person {

www_dong的博客 343

Effective C++条款30:透彻了解inlining的里里外外(Understand the ins and outs of inlining)

Effective C++条款30:透彻了解inlining的里里外外(Understand the ins and outs of inlining)

CltCj的博客 1097

Effective C++ 条款30:透彻了解inlining的里里外外

Effective_C++_30

君鼎的博客 504

Effective C++:条款30:透彻了解inlining的里里外外

(一) inline函数,可以调用它们而又不需蒙受函数调用所招致的额外开销。 inline函数背后的整体观念是,将“对此函数的每一个调用”都已函数本体替换之,这样做可能增加你的目标码(object code)大小。在内存有限的机器上,过度inline会造成程序体积太大,导致换页行为,降低缓存的命中率等一些带来效率损失的行为。如果inline函数的本体很小,编译器针对“函数本体”所产生的码可能比

u010470972的专栏 1349

Effective C++条款30:实现之(透彻了解inlining的里里外外)

一、inline的优缺点 优点 免除函数调用成本 缺点 以函数本体代替函数调用,因此目标大增大 在一台内存优先的机器上,过度使用inline会造成程序体积太大 即使拥有虚内存,inline造成的代码膨胀也会造成额外的换页行为,降低指令高速缓存装置的集中率,以及伴随效率的损失 二、隐式内联、显式内联 inline只是对编译器的一个申请,不是强制命令 隐式内联只现在class...

董哥的黑板报 809

《Effective C++》学习笔记条款30 透彻了解inlining的里里外外

透彻了解inlining的里里外外

UE引擎开发工程师 1418

Effective C++ 学习笔记 条款30 透彻了解inlining的里里外外

库的设计者在决定将函数声明为 inline 时,必须评估其影响,因为一旦库中某个客户端可见的内联函数被改动,就无法提供“二进制升级”——换句话说,如果库里的 f 是内联函数,那么库的客户会把 f 的函数体编译到他们自己的应用程序中。有时,即使编译器完全愿意内联某个函数,它仍然会为该函数生成一个独立的函数体。即使你从不使用函数指针,未被内联的内联函数也可能给你带来麻烦,因为索取函数指针的不一定是你——编译器有时也会生成构造函数和析构函数的非内联副本,以便在数组对象的构造和析构过程中获取这些函数的指针来使用。

tus00000的博客 387

Effective C++ 条款30_透彻了解 Inlining 的里里外外_非同凡响

Understand the ins and outs of inlining Inline 函数,多棒的主意呀!它们看起来像函数,动作像函数,比宏好得多(见条款 2 ),可以调用它们又不需蒙受函数调用所招致的额外开销。 更棒的是,你获得的比你想到的还多,因为 “ 免除函数调用成本 ” 只是故事的一部分而已。编译器最优机制通常被设计用来浓缩那些 “ 不含函数调用 ” 的代码,所以当你 inline 某个函数,或许编译器就因此有能力对它(函数本体)执行语境相关最优化。大部分编译器绝不会对着一个 “ outli

嘟嘟的博客 693

《Effective C++》:条款30:透彻了解inlining的里里外外

inline函数的优缺点,以及使用inline函数时注意的问题。

KangRoger的专栏 2631

读书笔记《Effective C++》条款30:透彻了解inlining的里里外外

inline函数,可以调用它们又不需要函数调用所招致的额外开销。inline函数背后的整体观念是,将“对此函数的每一个调用”都以函数本体替换之。这样做可能增加目标码大小,引发代码膨胀。 换个角度说,如果inline函数的本体很小,编译器对“函数本体”所产出的码可能比针对“函数调用”所产出的码更小。 inline可以以隐喻方式将函数定义于class定义式内,任何在类内部定义的函数自动地成为inl

Do-Program的专栏 314
上一篇: [Effective C++]条款29:为“异常安全”而努力是值得的
下一篇: 【C++并发编程】01、初识C++并发编程
Tim_10
博客等级 码龄2年 162粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值