当前位置: 首页 > 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;
}

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

相关文章:

  • 如何通过简单步骤保护您的网站安全
  • 【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详细教程
  • 乳腺癌识别:双模型融合
  • 行销和随销的区别
  • 东莞疫情感染人数/google移动服务应用优化
  • 四川建设网电子招标/南宁seo优势
  • 帮客户做违法网站违法么/百度搜索推广和信息流推广
  • wordpress所有分类/四川seo快速排名
  • 深圳商城网站建设/搜索引擎优化免费
  • 郑州做旅游网站的公司/网站关键词百度自然排名优化