为何要用inline内联函数
在C语言中,用define宏定义来消除函数调用带来的开销,例如define f(x) (x+1),但是define的使用是非常不安全的,define没有对类型进行检测,只是在预处理阶段由预处理器简单的进行字符串替换,这样很容易导致错误的出现,例如define f(x) ((++x)>5&&(++x)<10)?(x++):0),,C++中为了解决这种不安全,同时也为了没有函数调用的开销,所以C++中使用了inline的内联函数来解决这种问题。
C++完全兼容C,所以define还是需要的,同时define在有些地方还是有着不可替代的作用,例如文件包含中#ifndef #define #endif,
编译器对内联函数的处理
编译器在对任何函数,在编译阶段会把所有的函数类型和返回值类型放到符号表中,对于内联函数,也会把所用的函数类型和返回值类型放到符号表中,同时编译器碰到内联函数,会进行检测是否符合内联函数的要求,如果符合则将内联函数的函数体和函数类型和返回值一起放到符号表中。
使用内联函数会在调用内联函数的时候,在调用处把函数体在展开,所以内联函数虽然不会产生函数调用的开销,但是却赵成代码量变大,所以使用内联函数时应该考虑清楚。
内联函数的要求
因为内联函数的调用会赵成代码量变大,所以内联函数有一定的要求:
a) 内联函数代码量不能过大,一般来说不超过5行(未调查,无明确规定)。
b) 内联函数不应该有循环和开关语句
c)3、递归函数也属于结构复杂的函数,也不能作为内联函数。
内联函数的定义
a) 内联函数的定义必须和函数体放在一起才能起内联函数的作用。例如
inline void fun(); //函数声明
void fun()
{
}
fun并不能成为内联函数,但是下面的例子能成为内联函数
inline void fun()
{
}
如:bool isnumber(char); 此处没有inline,不是内联函数,即使在下面定义时使用了inline,编译器还是当成普通函数来调用
inline bool isnumber(char a ){
.......................
}
b) 在类里面定义函数是能够成为内联函数的。例如
Class A{
Public:
Void fun()
{
}
};
在类中的fun就成为了内联函数,同时我们也可以不在内联函数中定义内联函数,而在类的外面定义内联函数,例如:
Class A{
Public:
Void fun();
};
Inlinevoid fun()
{
}
内联函数的使用