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

实习冲刺练习 第二十四天

每日一题

多数元素. - 力扣(LeetCode)

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        sort(nums.begin(),nums.end());//先排序,找到中间的值就是多数元素
        return nums[nums.size()/2];
    }
};

八股

什么是 C++ 内联函数?它的作用是什么?

内联函数是一种通过提示编译器在调用该函数时将函数的代码直接嵌入到调用点的机制,从而减少函数调用开销的方法。

作用与特点

  1. 减少函数调用开销:在普通函数调用中,程序需要保存上下文信息、跳转到函数地址、执行函数代码并返回结果,而内联函数通过将函数体嵌入调用点,可以省去这些操作,从而提高性能。
  2. 适用于小型函数:内联函数通常用于代码量小、逻辑简单的函数(例如 getter、setter、计算函数等),以减少函数调用带来的开销。
  3. 可能增加代码体积(代码膨胀):由于内联函数在每次调用时都将被替换为实际的函数代码,如果调用次数多,且函数体较大,会导致编译后的程序体积变大。
  4. 编译器优化:inline 只是对编译器的建议,编译器可能会根据实际情况决定是否内联。
  5. 允许定义在头文件中:内联函数可以直接定义在头文件中,因为内联函数在调用点被展开,不会导致重复定义问题。

内联函数与普通函数有什么区别?如何定义和使用内联函数? 

内联函数与普通函数的区别

比较项目内联函数普通函数
调用方式函数调用时,编译器将函数代码直接嵌入到调用点,不需要函数调用开销。通过函数调用指令执行,存在参数压栈、跳转和返回等开销。
关键字使用 inline 关键字定义,或者直接在类中定义(隐式内联)。无需使用任何特殊关键字。
代码存储函数体代码嵌入调用点,多个调用点可能会重复生成相同代码,导致程序体积变大。函数体代码只定义一次,所有调用点通过跳转共享这段代码。
适用场景适用于代码量小、逻辑简单、频繁调用的函数(如 getter/setter 或小型工具函数)。适用于复杂逻辑、大量代码或不适合内联优化的场景(如递归、循环等)。
递归支持不支持递归函数作为内联函数,因为递归的展开是无限的。完全支持递归。
调试和优化嵌入到调用点后,可能难以调试,代码阅读也变得复杂;现代编译器可能忽略 inline 提示。调试较为简单,调用点明确。
使用头文件定义在头文件中不会产生重复定义错误,因为函数体嵌入在调用点处编译。如果定义在头文件中,可能因重复定义而导致链接错误(需要 extern 声明)。

 定义和使用内联函数

定义方法
  • 显式内联:在函数定义前加 inline 关键字。
  • 隐式内联:直接在类定义中实现成员函数。

显式

#include <iostream>
inline int multiply(int a, int b) {
    return a * b;
}

int main() {
    int x = 3, y = 4;
    std::cout << "Product: " << multiply(x, y) << std::endl; // 调用内联函数
    return 0;
}

隐式

#include <iostream>
class Rectangle {
public:
    // 在类定义中实现的成员函数是隐式内联的
    int area(int width, int height) { return width * height; }
};

int main() {
    Rectangle rect;
    std::cout << "Area: " << rect.area(5, 6) << std::endl; // 调用内联函数
    return 0;
}
使用方式
  1. 声明和定义在一起:内联函数需要在声明处提供函数的完整定义,通常写在头文件中。
  2. 调用方式与普通函数相同:调用时,程序员看不到任何区别,编译器自动决定是否内联展开。
  3. 适用于简单逻辑的场景:内联函数应避免复杂逻辑或过长的代码,通常用于频繁调用的小函数。

http://www.kler.cn/a/398550.html

相关文章:

  • C++深度搜索(2)
  • 华为开源自研AI框架昇思MindSpore应用案例:人体关键点检测模型Lite-HRNet
  • 螺旋矩阵II(leetcode 59)
  • vuex和pinia的区别
  • 【Node.js】使用 Node.js 需要了解多少 JavaScript?
  • linux笔记(防火墙)
  • 《Django 5 By Example》阅读笔记:p54-p75
  • 无需制作PE系统盘,完成更换固态,数据迁移
  • Windows docker下载minio出现“Using default tag: latestError response from daemon”
  • Matlab使用深度网络设计器为迁移学习准备网络
  • Spark读MySQL数据rdd分区数受什么影响,读parquet、hdfs、hive、Doris、Kafka呢?
  • spring-gateway网关聚合swagger实现多个服务接口切换
  • OceanBase单表恢复(4.2.1.8)
  • 【SSL证书】腾讯云SSL续签备忘录
  • VScode+opencv——关于opencv多张图片拼接成一张图片的算法
  • 深入剖析Kubernetes监控体系:Prometheus、Metrics Server与Kubernetes监控体系
  • 二五、pxe自动装机
  • C# WPF .NET6程序可以直接运行?不需要装.NET运行时?
  • 【jvm】HotSpot中方法区的演进
  • 【java】值传递引用传递
  • JAVA中对象实体与对象引用有何不同?举例说明
  • Transformer学习笔记(一)
  • 机器学习基础03
  • Android 关于使用videocompressor库压缩没有声音和异常的问题
  • 专题二十_动态规划_简单多状态dp问题_买卖股票系列问题_算法专题详细总结
  • 「Qt Widget中文示例指南」如何创建一个窗口标志?(二)