【C++】 6 内联函数的分析

码林薄雾
• 阅读 195

一、常量与宏回顾

c++中的const常量可以替代宏常数的定义

二、内联函数

C++在推荐使用内联函数替代宏代码片段

C++中使用inline关键字声明内联函数

inline 对编译器的一种请求。

inline int func(int a,int b)
{
    return a<b?a:b;
}

示例代码:

#include <stdio.h>

#define FUNC(a, b) ((a) < (b) ? (a) : (b))

inline int func(int a, int b)
{
    return a < b ? a : b;
}

int main(int argc, char *argv[])
{
    int a = 1;
    int b = 3;
    int c = FUNC(++a, b);
   // c = ((++a) < (b) ? (++a) : (b));
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
    
    return 0;
}

输出结果:

a = 3
b = 3
c = 3

C++编译器可以将一个函数进行内联编译

被C++编译器内联编译的函数叫做内联函数

C++编译器直接将函数体插入函数调用的地方

内联函数内有普通函数调用时的额外开销(压栈,跳转,返回)

内联函数具有普通函数的特征(参数检查,返回类型等)

函数的内联请求可能被编译器拒绝

函数被内联编译后,函数体直接扩展到调用的地方

现代C++编译器能够进行编译优化,一些函数即使没有inline声明,也可能被内联编译

C++提供了扩展语法,能够对函数进行强制内联。

例:

#include <stdio.h>

//__forceinline
//__attribute__((always_inline))
inline 
int add_inline(int n);

int main(int argc, char *argv[])
{
    int r = add_inline(10);

    printf(" r = %d\n", r);

    return 0;
}

inline int add_inline(int n)
{
    int ret = 0;

    for(int i=0; i<n; i++)
    {
        ret += i;
    }

    return ret;
}

输出结果:

ret = 45;

三、注意事项

【C++】 6 内联函数的分析

小结:

C++中可以通过inline声明内联函数

编译器直接将内联函数体扩展到函数调用的地方

inline只是一种请求,编译器不一定允许请求

内联函数省去了函数调用时的压栈,跳转和返回的开销

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java Lambda表达式
简介  Lambda可以理解为简洁的表示可传递的匿名函数,包括:参数列表、函数主体、返回类型、抛出的异常列表(可以不存在)。  函数式接口:定义一个抽象方法的接口(接口可以拥有默认方法:default)。  函数式接口有什么用?    Lambda可以以内联的形式为函数式接口的抽象方法提供实现。虽然内部类也可以实现,但lambda表达
Stella981 Stella981
3年前
C++中stoi函数
作用:  将n进制的字符串转化为十进制头文件:include<string用法:1stoi(字符串,起始位置,n进制),将n进制的字符串转化为十进制23示例:4stoi(str,0,2);//将字符串str从0位置开始到末尾的2
Easter79 Easter79
3年前
SVG.图形在网页中的位置
1、<svg/直接写在html中,得到svg中图形(图形A)的位置,将浮动的<div/移动到图形A的上方2、测试代码:(chromeforwindows 版本56.0.2924.87中效果OK)<!内联XHTML<!<!DOCTYPEhtmlPUBLIC"//W3C//DTDX
Stella981 Stella981
3年前
Kotlin 1.4.30
关键词:KotlinNews内联类从1.3推出,一直处于实验状态。内联类inlineclass,是从Kotlin1.3开始加入的实验特性,计划1.4.30进入Beta状态(看来1.5.0要转正了?)。内联类要解决的问题呢,其实也与以往我们接触到的内联函数类似,大体思路就是提供某种语法,提升代码编写体验和效率
Wesley13 Wesley13
3年前
3_PHP表达式_1_常量
以下为学习孔祥盛主编的《PHP编程基础与实例教程》(第二版)所做的笔记。PHP常量分为自定义常量与预定义常量。1.自定义常量  在使用前必须先定义,PHP的define()函数专门用于定义自定义常量,define()函数的语法格式为:define(name,value\,booleancase\_insensitive\)。  
Wesley13 Wesley13
3年前
ES6新增的一些特性
1、let关键字,用来代替var的关键字,特点: 1、变量不允许被重复定义2、不会进行变量声明提升3、保留块级作用域中i的2、const定义常量,特点:1、常量值不允许被改变2、不会进行变量声明提升3、箭头函数  与普通函数的区别:1、书写上用代替了function         2、普通函数的this指向window而ES6
Stella981 Stella981
3年前
C++中int的构造函数
引言看到有本书中是这样写的:std::map<intd;da;如果map中没有\\操作符会自动插入,插入时会调用默认构造函数初始化,int会初始化吗?大牛写的书应该不会有错。问题曾经见过有这样的写法:inta(10);貌似是构造函数的语法。那么这些呢:
Wesley13 Wesley13
3年前
C++错误收集(2)
ERRORNO.2内置函数inline。类体中定义的函数功能一般规模较小,系统调用类为定义的函数的过程需要的时间开销是比较大的,为了减少系统调用函数的时间开销,如果在类体智能光定义的函数不包括循环等控制结构,C会自动将它们作为内置函数。内置函数的作用是将函数实现的代码替代声明的地方,以减小系统调用类外函数的时间开销。今天使用是遇到了问题
Wesley13 Wesley13
3年前
C++并发编程实战
1\.当把函数对象传入到线程构造函数中时,需要避免“最令人头痛的语法解析”。如果传递了一个临时变量,而不是一个命名的变量;C编译器会将其解析为函数声明,而不是类型对象的定义。例如:classbackground_task{public:voidoperator()()const{d
Wesley13 Wesley13
3年前
VC++知识点整理
1.内联函数定义:定义在类体内的成员函数,即函数的函数体放在类体内特点:在调用处用内联函数体的代码来替换,用于解决程序的运行效率问题。一定要在调用之前定义,并且内联函数无法递归调用。2.构造函数与析构函数构造函数:用于为对象分配内存空间,对类的成员变量进行初始化,并执行其他内部管理操作。可以接受参
码林薄雾
码林薄雾
Lv1
那些离乱的现实,岂能容我当作思绪来写。
文章
4
粉丝
0
获赞
0