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]<<" "; } }
结果