C/C++内联函数

使用方法

内联 inline 是个修饰符,用来修饰体积不大又调用频繁的函数,可以减小函数调用的开销。

 

所谓减小开销,就是在编译时把函数体的代码嵌入进去,达到和宏类似的效果,这样程序在运行到该函数时,就不需要在频繁的跳转中消耗栈的空间。

 

从经验上来说,函数体在十行以内,执行逻辑极其简单(写值,简单的判断和计算等),调用又十分频繁,尤其是一些工程代码中会放在周期循环里一直跑的,联系到其它模块的函数,就可以写成内联函数。

 

格式:

inline + <函数头>

 

使用起来很简单,在函数头前面加上个inline就行,但有一点要注意,inline修饰的函数要当场给出其原型。inline只是修饰符,不能用作声明

 

下面写法是不允许的:

inline int max(int a,int b);

int max(int a,int b)
{
    //......
}

 

下面写法是允许的:

int max(int a,int b);

inline int max(int a,int b)
{
    //......
}

 

另外,内联函数无法使用for,while,switch语句。C++的类里面的成员函数会被默认为内敛函数。

 

慎用内敛函数,除非它足够简单。最好把它们统一写到一个头文件里使用。

 

和宏有什么区别?

 1.内联函数在运行时可调试,而宏定义不可以;

2.编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会;

3.内联函数可以访问类的成员变量,宏定义则不能;

4.在类中声明同时定义的成员函数,自动转化为内联函数。

 

宏是不加任何验证的简单的代码字符串替换,而内联函数说到底仍然是函数。

 

练习

定义一种结构体,内部有两个vector容器,一个用来存储奇数,一个用来存储偶数。

定义两个内联函数,第一个判断特定数字是奇数还是偶数,第二个把数字作区分后写到结构体里的vector容器内。

检测0~99内的一百个数,分别显示出所有奇数和偶数。

 

extra.h

#ifndef _EXTRA_H_
#define _EXTRA_H_

#include <iostream>
#include <vector>
using std::vector;

typedef unsigned short        uint8;
typedef bool                  B;

typedef struct
{
    vector<uint8>oddnumbers;
    vector<uint8>evennumbers;
}NUMBERS_ST;

NUMBERS_ST hundred_numbers;

inline B check_odd_even(uint8 n)
{
    return (n%2>0)?true:false;
}

inline void write_odd_even_numbers(uint8 n)
{
    if(check_odd_even(n))
    {
        hundred_numbers.oddnumbers.push_back(n);
    }
    else
    {
        hundred_numbers.evennumbers.push_back(n);
    }
}


#endif // _EXTRA_H_

 

main.cpp

#include "extra.h"

int main()
{
    for(uint8 i=0;i<100;i++)
    {
        write_odd_even_numbers(i);
    }
    std::cout<<"Odd numbers:\n";
    for(uint8 i=0;i<hundred_numbers.oddnumbers.size();i++)
    {
        std::cout<<hundred_numbers.oddnumbers[i]<<" ";
    }
    std::cout<<"\n";
    std::cout<<"Even numbers:\n";
    for(uint8 i=0;i<hundred_numbers.evennumbers.size();i++)
    {
        std::cout<<hundred_numbers.evennumbers[i]<<" ";
    }

}

 

结果

 

posted @ 2019-11-01 11:07  MorpheusDong  阅读(775)  评论(0编辑  收藏  举报