码迷,mamicode.com
首页 > 编程语言 > 详细

c++之内联inline

时间:2020-04-06 17:27:03      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:amp   函数定义   编译器   栈的操作   存在   不能   类型   说明   ret   

内联定义:

内联是为了节约函数的调用开销而诞生的,我们在调用一个普通函数的时候,存在的额外的开销(压栈、出栈)等。内联是让编译器使用内联的方式编译函数,在调用这个内联函数的时候,直接把这个函数展开,不存在压栈、出栈的操作

例子

#include <iostream>
inline void example() {
    std::cout << "example" << std::endl;
}
int main() {
    example();
    return 0;
}

说明

使用inline在函数定义实现前面加上,代表请求编译器对这个函数内联编译(注意是请求,可能失败)

内联和宏的区别

内联的诞生就是为了替换宏定义

例子

#include <iostream>
#define exa(a)    (std::cout << a << std::endl)
inline void example(int a) {
    std::cout << a << std::endl;
}
int main() {
    int a = 10;
    example(a++);
    exa(a++);
    return 0;
}
代码输出:
10
11

对于内联函数传参还是按照正常的函数进行的,也会有函数的类型检查。但是宏定义没有,宏定义仅仅是代码的替换,所以会有很多问题

对于类

在类的头文件直接声明定义的不需要加参数会自动inline
但是如果是头文件声明,.cpp定义那就还是需要定义加上inline

inline和static

static的作用我们都知道是静态
对于普通的不在类里面的内联函数,也就是一个函数你想像c语言那样进行使用,编译器要求当前文件调用的内联函数是可见的,也就是在当前文件中被定义,虽然这样最终导致有多个定义的内联函数,但是这样是被允许的。常用的做法是把内联函数的定义放在一个头文件,然后需要使用的文件包含这个内联头文件,如果你把内联函数的定义放在头文件,那么就要加上static,作用是当函数不被允许内联的时候不会报错:一个函数在多个地方重复定义

内联的双刃剑

好处:代替宏,有函数的基础功能,检查类型等,没有开销
限制:
1.在定义前面加上inline,在声明前面加不加都行
2.inline仅仅是一个请求编译器可能因为某些原因不内联编译
3.内联的函数不能有循环语句
4.不能对内联函数地址
5.函数内部不能太复杂,不能存在过多条件判断
6.使用const代替变量的宏定义,inline代替函数的宏定义
坏处:让函数体变得臃肿,需要编译器支持

c++之内联inline

标签:amp   函数定义   编译器   栈的操作   存在   不能   类型   说明   ret   

原文地址:https://www.cnblogs.com/zero-waring/p/12642723.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!