内联函数的出现

这篇具有很好参考价值的文章主要介绍了内联函数的出现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

inline_func

在c++中,预定义宏的概念是用内联函数来实现的,而内联函数本身也是一个真正的函数。内联函数具有普通函数的所有行为。唯一不同之处在于它在编译时会被直接插入到调用它的地方,而不是像普通函数那样在运行时被调用。这样,内联函数可以避免函数调用的开销,提高代码执行效率,所以不需要函数调用的开销。因此应该不使用宏,使用内联函数。

C++中的宏函数是一种使用预处理器定义的函数宏。它们是一种在编译阶段进行简单文本替换的机制,可以将代码中的宏函数调用替换为相应的文本。宏函数通常使用#define指令来定义。

预处理宏的缺陷

宏函数的定义格式如下:

#define 宏函数名(参数列表) 替换文本

这里的宏函数名是一个标识符,用于表示宏函数的名称,参数列表是宏函数的参数,替换文本是该宏函数在实际使用时要替换的代码。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#define ADD(x,y) x+y
void test() {
	int ref = ADD(10, 20) * 2;
	cout << "ref=" << ref << endl;
}

int main() {
	test();
	return 0;
}

内联函数的出现

宏函数只是简单文本替换,它没有遵循运算符优先级.所以源代码被转译成了10+20*2=50

但是如果使用内联函数,则会效率提高且安全。

#define ADD(x,y) x+y
inline int Add(int x,int y){
	return x + y;
}
void test(){
	int ret1 = ADD(10, 20) * 10; //希望的结果是300
	int ret2 = Add(10, 20) * 10; //希望结果也是300
	cout << "ret1:" << ret1 << endl; //210
	cout << "ret2:" << ret2 << endl; //300
}

内联函数的出现

再看一个示例:

#define COMPARE(x,y) ((x) < (y) ? (x) : (y))
#include<iostream>
using namespace std;
inline int compare(int x, int y) {
	return x < y? x:y;
}
void test() {
	int regina_1 = 1;
	int regina_2 = 1;
	int ivanlee = 3;
	cout << COMPARE(++regina_1, ivanlee) << endl;
	cout << compare(++regina_2, ivanlee) << endl;
}

int main() {
	test();
	return 0;
}

参数 ++a 和 b 都会在调用 COMPARE 函数前被求值,因此实际上是 COMPARE(2, 3)。由于宏函数只是简单的文本替换,所以++a被求了两次,最终的结果是

内联函数的出现

内联函数

在c++中,预定义宏的概念是用内联函数来实现的,而内联函数本身也是一个真正的函数。内联函数具有普通函数的所有行为。唯一不同之处在于内联函数会在适当的地方像预定义宏一样展开,所以不需要函数调用的开销。因此应该不使用宏,使用内联函数。

在普通函数(非成员函数)函数前面加上inline关键字使之成为内联函数。但是必须注意必须函数体和声明结合在一起,否则编译器将它作为普通函数来对待。

inline void func**(**int a**);**

以上写法没有任何效果,仅仅是声明函数,应该如下方式来做:

inline int func**(**int a**){****return** **++;}**

注意: 编译器将会检查函数参数列表使用是否正确,并返回值(进行必要的转换)。这些事预处理器无法完成的。

内联函数的确占用空间,但是内联函数相对于普通函数的优势只是省去了函数调用时候的压栈,跳转,返回的开销。我们可以理解为内联函数是以空间换时间

任何在类内部定义的函数自动成为内联函数。

class Person{
public:
	Person(){ cout << "构造函数!" << endl; }
	void PrintPerson(){ cout << "输出Person!" << endl; }
}

内联函数和编译器

内联函数并不是何时何地都有效,为了理解内联函数何时有效,应该要知道编译器碰到内联函数会怎么处理?

对于任何类型的函数,编译器会将函数类型(包括函数名字,参数类型,返回值类型)放入到符号表中。同样,当编译器看到内联函数,并且对内联函数体进行分析没有发现错误时,也会将内联函数放入符号表。

当调用一个内联函数的时候,编译器首先确保传入参数类型是正确匹配的,或者如果类型不正完全匹配,但是可以将其转换为正确类型,并且返回值在目标表达式里匹配正确类型,或者可以转换为目标类型,内联函数就会直接替换函数调用,这就消除了函数调用的开销。假如内联函数是成员函数,对象this指针也会被放入合适位置。

类型检查和类型转换、包括在合适位置放入对象this指针这些都是预处理器不能完成的。

内联函数的出现

内联仅仅只是给编译器一个建议,编译器不一定会接受这种建议,如果你没有将函数声明为内联函数,那么编译器也可能将此函数做内联编译。一个好的编译器将会内联小的、简单的函数。文章来源地址https://www.toymoban.com/news/detail-825014.html

到了这里,关于内联函数的出现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 内联函数的出现

    在c++中,预定义宏的概念是用内联函数来实现的,而 内联函数本身也是一个真正的函数 。内联函数具有普通函数的所有行为。唯一不同之处在于它在编译时会被直接插入到调用它的地方,而不是像普通函数那样在运行时被调用。这样,内联函数可以避免函数调用的开销,提

    2024年02月19日
    浏览(7)
  • 【C++】内联函数 ( 概念简介 )

    \\\" 内联函数 \\\" 是 C++ 语言中的一种特殊函数 , 其目的是为了提高程序的执行效率 ; 在 C++ 中 , 定义常量 可以替换 C 语言中的 宏定义 使用 常量 可以 替代 宏定义 ; 宏定义分为两种 , 一种是 宏常数 , 另外一种是 宏代码片段 ; C++ 中使用 常量 替代 宏常数 ; C++ 中用于 替代 宏代码片

    2024年02月10日
    浏览(28)
  • 为什么inline 函数定义在头文件.h中

    一、是不是Inline函数只能定义在.h中? 答案:不是。你可以在A.c 和 B.c里重复定义一个inline void func()函数给A.c和B.c用。 二、为什么inline函数只能定义在.h中? 答案:因为可以解决所用调用inline函数的所有.c文件反复定义该inline函数,inline函数具有局部可见性。编译器不会生成

    2024年02月10日
    浏览(48)
  • 【跟小嘉学 Rust 编程】二十四、内联汇编(inline assembly)

    【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学 Rust 编程】六、枚举

    2024年02月10日
    浏览(48)
  • 23:kotlin类和对象 -- 内联值类(Inline value classes)

    有时,将一个值包装在一个类中可以创建一个更具领域特定类型的类。然而,由于额外的堆分配,这会引入运行时开销。此外,如果包装的类型是原始类型,性能损失是显著的,因为原始类型通常由运行时进行了大量优化,而它们的包装类没有得到任何特殊处理。 为了解决这

    2024年02月03日
    浏览(40)
  • 【C++】多态的概念和简单介绍、虚函数、虚函数重写、多态构成的条件、重载、重写、重定义

        C++中的多态是一种面向对象编程的特性, 它允许不同的对象对同一个消息做出不同的响应。 多态性能够提高代码的可复用性和灵活性,使得代码更加模块化和可扩展。    多态性是通过使用继承和虚函数实现的。 当一个类被声明为虚函数时,它可以被子类重写,并

    2024年02月13日
    浏览(40)
  • 【C++】泛型编程 ① ( 函数模板 | 函数模板概念 | 函数模板意义 | 函数模板定义语法 | 函数模板调用语法 | 显式类型调用 | 自动类型推导 )

    在 C++ 语言中 , 泛型编程 的 核心就是 函数模板 和 类模板 ; 函数模板 Function Template 是 C++ 语言 中的 重要特性 ; 函数模板概念 : 建立一个 \\\" 通用函数 \\\" , 不指定该函数的 函数返回值类型 和 函数参数类型 , 仅使用 \\\" 虚拟类型 \\\" 代表 上述 两种类型 , 该 \\\" 通用函数 \\\" 就是 \\\" 函数模

    2024年02月19日
    浏览(34)
  • 【C++】函数重载 & 引用 & 内联函数

    目录 一,函数重载 1,函数重载的概念 2,C++支持函数重载的原理 二,引用 1,引用概念 2,引用特性 3,常引用 4,做参数 5,做返回值 6,传值、传引用效率比较 7,值和引用的作为返回值类型的性能比较 8,引用和指针的区别 三,内联函数 1,概念 2,特性 自然语言中,一个

    2024年02月08日
    浏览(35)
  • 【内联函数和构造函数的联系】

    内联函数和构造函数是C++中的两个不同的概念,它们在对象的生命周期和程序性能方面有不同的作用。然而,它们可以在某些情况下相互关联,尤其是在创建对象并使用构造函数时。 构造函数的作用 : 构造函数是用于初始化类对象的特殊成员函数,它们在对象创建时被调用

    2024年02月07日
    浏览(17)
  • Kotlin学习 - 高阶函数和内联函数

    高阶函数定义 如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数就称为高阶函数。 以前开发的时候,入参或返回值都是基本类型或者对象,但是在Kotlin中出现了一个新的类型:函数类型。就是函数也可以像 String 这种类型一样做入参或者返

    2024年02月12日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包