c/c++的关键字 inline 介绍

embedded/2024/10/21 10:12:32/

c/c++

C和C++是两种非常流行的编程语言,它们在许多方面有相似之处,但也存在一些关键的区别。以下是C和C++的一些主要特点和差异:

  • C语言的特点:
    过程式编程:C是一种过程化的语言,强调过程和函数的使用。
    简洁高效:C语言以其简洁和高效而闻名,它提供了对硬件的底层访问能力。
    可移植性:C语言编写的程序具有良好的可移植性,可以跨多种计算机系统和架构运行。
    指针:C语言对指针提供了强大的支持,允许进行高级内存操作。
    标准库:C语言有一个功能丰富的标准库,包括字符串处理、数学函数、文件I/O等。
  • C++语言的特点:
    多范式编程:C++不仅支持过程式编程,还支持面向对象编程(OOP)和泛型编程。
    面向对象:C++引入了类(class)、对象、继承、多态和封装等OOP概念。
    异常处理:C++提供了异常处理机制,可以更优雅地处理程序运行中的错误。
    模板:C++的模板提供了一种编写泛型代码的方法,支持类型参数化。
    标准模板库(STL):C++有一个强大的标准模板库,包括容器、迭代器、算法等。
    运行时多态:通过虚函数,C++支持运行时多态,允许通过基类指针或引用调用派生类的方法。
  • C++相对于C的额外特性:
    类和对象:C++允许使用用户定义的数据类型,即类,来创建对象。
    引用:C++引入了引用的概念,它允许为变量创建别名。
    函数重载:C++允许在同一作用域内定义多个名称相同但参数不同的函数。
    运算符重载:C++允许对运算符进行重载,以实现自定义类型的特殊运算。
    命名空间:C++提供了命名空间(namespace),用于解决大型程序中的名称冲突问题。
    构造函数和析构函数:C++提供了特殊的成员函数,用于初始化对象(构造函数)和销毁对象(析构函数)。
  • C++相对于C的局限性:
    复杂性:C++比C更复杂,有更多概念和特性需要学习。
    性能开销:由于C++支持面向对象和异常处理等特性,可能会带来一些额外的性能开销。
  • C++对C的兼容性:
    C++是C的超集:C++设计时保留了C的大部分特性,因此C语言编写的程序几乎不需要修改就可以在C++编译器上编译运行。
    C风格的代码:在C++程序中可以自由使用C风格的代码。

inline_29">inline关键字

在C和C++中,inline是一个函数修饰符,用于建议编译器在编译时将函数的定义直接插入到每个调用该函数的地方,而不是生成常规的函数调用代码。这样做的目的是为了减少函数调用的开销,尤其是在函数体较小且被频繁调用的情况下。然而,是否真正内联函数的决定权在于编译器,编译器可能会基于多种因素(如函数大小、优化级别、寄存器使用情况等)选择忽略inline关键字。

inline关键字的一些使用要点:

  • 建议性inline只是一个对编译器的建议,编译器可以选择忽略它。
  • 小函数:通常用于小的、简单的函数,如简单的getter和setter方法,或者一些简短的计算函数。
  • 多个定义:对于inline函数,如果它在多个编译单元(即多个不同的源文件)中定义,那么这些定义必须完全相同,否则编译器将报错。
  • 虚函数:虚函数通常不会被内联,因为运行时多态的机制需要在运行时确定调用哪个函数。
  • 内联限制:某些编译器对内联函数的大小有限制,如果函数体过大,编译器可能不会将其内联。
  • 优化:在编译时,编译器会进行各种优化,包括是否内联一个函数。优化级别(如-O1, -O2, -O3等)会影响内联决策。
  • 模板函数:对于模板函数,内联可以更有效,因为模板实例化时会生成具体的函数体,这使得编译器更容易做出内联决策。
  • 内联建议inline是一个建议,编译器可以选择忽略它。通常,如果函数体很小,且在程序中有多个调用点,编译器更倾向于内联。

inline关键字的缺点:

  • 过度使用inline可能会导致代码膨胀,这可能会增加缓存未命中的可能性,从而降低程序的性能。因此,合理使用inline关键字是非常重要的。

inline_46">inline函数与普通函数区别

  • 普通函数:
    f1()函数调用普通函数f0()时,将程序执行地址转变为f0()的函数地址,执行完f0()后,再将程序的执行地址转换为f1()的函数地址。这种函数地址的转移操作需要保护现场和函数地址的压栈和出栈等操作,执行完成后恢复现场。
  • 内联函数:
    在编译阶段,将f0()的代码拷贝到f1()的指定位置,在f1()函数调用普通函数f0()时,不需要函数地址的转移以及压栈出栈、保护现场等操作。

inline_52">inline函数与宏函数的区别

  • 与宏作用类似,但c++不推荐使用宏;
  • 区别是宏是预编译时的机械替换,而inline是编译时进行的;

inline_55">inline关键字示例

  • 不使用inline关键字的函数:
+---------------+       +---------------+
|               |       |               |
| 调用代码      | ----> |  函数定义     |
|               |       |               |
+---------------+       +---------------+主程序                     函数A
// File: non_inline_function.h
class NonInlineClass {
public:void normalFunction();
};// File: non_inline_function.cpp
#include "non_inline_function.h"void NonInlineClass::normalFunction() {// Function implementation
}

在这个示例中,normalFunction是一个普通的成员函数,没有使用inline关键字。这个函数的定义在.cpp文件中,因此它可以在多个编译单元中使用,但每次调用都需要完整的函数调用开销。

  • 使用inline关键字的函数:
+---------------+       +---------------+
|               |       |               |
| 调用代码      |       |  函数定义     |
|               |       |               |
+---------------+       +---------------+主程序                     函数B(函数B的定义被插入到此处)
// File: inline_function.h
class InlineClass {
public:inline void inlineFunction();
};// File: inline_function.cpp
#include "inline_function.h"void InlineClass::inlineFunction() {// Function implementation// This code could potentially be inlined by the compiler
}

在这个示例中,inlineFunction被声明为inline。这意味着编译器被建议在每个调用点直接插入这个函数的代码,而不是生成函数调用的代码。然而,这只是一个建议,编译器可能会基于自己的优化策略决定是否内联。


http://www.ppmy.cn/embedded/6564.html

相关文章

设计模式之模板方法模式详解(上)

模板方法模式 1)概述 1.定义 定义一个操作中算法的框架,而将一些步骤延迟到子类中,模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2.方案 背景:某个方法的实现需要多个步骤(类似…

科目一笔记

扣分 目前只有 12 9 6 3 1分。 扣1分的 会车 不按照规定会车, 普倒掉(普通路上不按规定掉头,倒车) ​ 高速、城市快速路…以外的道路 普通路 ​ 校车…以外的道车 普通车 使用灯光 ​ 需要注意的是只有不按规定使用灯光&…

js 过滤 json 数据

js 过滤 json 数据 一、一维数组过滤1、filter2、map 二、复杂数组过滤三、树形数据过滤四、过滤附件数组 — filter、map、findIndex 一、一维数组过滤 1、filter let arr [{id: 1,name: "张三",age: 18},{id: 2,name: "李四",} ] arr arr.filter(ite…

BaiChuan13B-GPTQ量化详解

知识要点: 1、按照网上搜索的一些代码,如使用auto_gptq原生库进行训练后量化,可能会正常量化,但是在线推理时会出现如找不到bin文件或者tf文件,即模型权重文件,所以和网上大部分代码不同的地方在于&#xf…

【软件工程与实践】(第四版)第6章习题答案详解

第6章 一、填空题二、选择题三、简答题四、实践题 一、填空题 (1) 编程语言是人与计算机交流的 工具。 (2) 从语言层次上,编程语言可以分为 低级语言 和 高级语言 两种类型。 (3) 1960年代出现…

《设计模式之美》第一章 总结

《设计模式之美》第一章 总结 第一章 概述 1.1 为什么学习代码设计 编写高质量的代码应对复杂代码的开发程序员的基本功职业发展的必备技能 1.2 如何评价代码的质量 1.2.1 可维护性 可维护性代码的特性:代码简洁、可读性好、可扩展性好代码分层结构清晰、模块化…

信道的题目

调制信道分为恒参信道和随参信道。恒参信道举例:各种有线信道;中长波地波传播、卫星中继。随参信道举例:短波电离层反射信道、各种散射信道、移动通信信道。狭义信道分为有线信道和无线信道。广义信道包含调制信道和编码信道。调制信道中不包…

java怎么创建字符串数组(java创建一个string数组)

java中如何创建字符串数组? 字符串数组的创建:String a new String(Java);不过推荐用ArrayList strArray new ArrayList (); 比较灵活。 String[][] snew String[60][3];这和60个数组是一样的,编程不能太死了。 例…