当前位置: 首页 > news >正文

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

.
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;
}

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

http://www.dtcms.com/a/126899.html

相关文章:

  • 如何通过简单步骤保护您的网站安全
  • 【Dart语言】七、类修饰符
  • 5️⃣ Coze+AI应用基础教学(2025年全新版本)
  • LLM之Agent(十六)| MCP已“过时”?Google近期推出Agent2Agent 协议 (A2A)
  • 学校安全用电解决电安全隐患-充满活力的校园享受科技进步的便利
  • LangGraph 架构详解
  • 计算机组成原理——CPU与存储器连接例题
  • UML-银行取款序列图
  • 《解锁分布式软总线:构建智能设备统一管理平台》
  • Python装饰器(Decorator)详解
  • 【c】-include经典注入问题
  • Python学习笔记(二)(字符串)
  • 有哪些反爬机制可能会影响Python爬取视频?如何应对这些机制?
  • C#结合SQLite数据库使用方法
  • Dynamics365 ExportPdfTemplateExportWordTemplate两个Action调用的body构造
  • CASAIM自动化智能检测系统在螺杆转子数字化检测应用
  • 使用 Datadog 和 Slack Alerts 监控 minikube
  • Linux安装Elasticsearch详细教程
  • 乳腺癌识别:双模型融合
  • 行销和随销的区别
  • 深入理解 WebMvcConfigurer:定制 Spring MVC 的核心接口
  • AI与深度伪造技术:如何识别和防范AI生成的假视频和假音频?
  • CentOS 系统磁盘扩容并挂载到根目录(/)的详细步骤
  • 24FIC
  • 【数学建模】(智能优化算法)天牛须算法(Beetle Antennae Search, BAS)详解与Python实现
  • 利用 RNN 预测股票价格:从数据处理到可视化实战
  • 人工智能之数学基础:复矩阵
  • 机器人零位标定修正流程介绍
  • ZFS 数据恢复:从误删修复到 RAIDZ 恢复,原生工具与第三方软件对比
  • 【图像处理】:opencv实现模糊图像处理和对比度增强