简单来说:inline类似于宏定义define,但又消除了它的缺点,继承了它的优点。
内联函数和宏的差别是什么?
答案:
(1)内联函数常驻内存,和普通函数相比可以加快程序运行的速度,因为不需要中断调用,在编译的时候内联函数可以直接被镶嵌到目标代码中。而宏只是一个简单的替换。
(2)内联函数要做参数类型检查,这是内联函数跟宏相比的优势。
(3)inline是指嵌入代码,就是在调用函数的地方不是跳转,而是把代码直接写到那里去。对于短小的代码来说,inline可以带来一定的效率提升,而且和C时代的宏函数相比,inline更安全可靠。可是这个是以增加空间消耗为代价的。至于是否需要inline函数,就需要根据实际情况来取舍了。
inline一般只用于如下情况:
(1)一个函数不断被重复调用。
(2)函数只有简单的几行,且函数内不包含for、while、switch语句。
一般来说,我们写小程序没有必要定义成inline,但是如果要完成一个工程项目,当一个简单函数被调用多次时,则应该考虑用inline。
宏与宏的缺陷:
宏在C语言里极其重要,而在C++里用得就少多了。关于宏的第一规则是绝不应该去使用它,除非你不得不这样做。几乎每个宏都表明了程序设计语言里、程序里或者程序员的一个缺陷,因为它将在编译器看到程序的正文之前重新摆布这些正文。宏也是许多程序设计工具的主要麻烦。所以,如果你使用了宏,就应该准备只能从各种工具(如排错系统、交叉引用系统、轮廓程序等)中得到较少的服务。
宏是在代码处不加任何验证的简单替代,而内联函数是将代码直接插入调用处,而减少了普通函数调用时的资源消耗。
宏不是函数,只是在编译前(编译预处理阶段)将程序中有关字符串替换成宏体。
inline函数是函数,但在编译中不单独产生代码,而是将有关代码嵌入到调用处。
inline fact(float i) {return i * i}; //没有写返回值的
printf("bb= %d", fact(8)); //调用时就是执行printf("bb= %d", 8*8);
在何时使用inline函数:
首先,你可以使用inline函数完全取代表达式形式的宏定义。
另外,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处。内联函数最重要的使用地方是用于类的存取函数。
此外还有一些规则需注意:
1、inline说明对编译器来说只是一种建议,编译器可以选择忽略这个建议。比如,你将一个长达1000多行的函数指定为inline,编译器就会忽略这个inline,将这个函数还原成普通函数。
2、在调用内联函数时,要保证内联函数的定义让编译器"看"到,也就是说内联函数的定义要在头文件中,这与通常的函数定义不一样。
—————————————————————————————————————————————————
例一:查找map
/* store all arguments into a map, with key and value.*/
map<string,string> arguments;
/*the common function to get a option value.*/
template<class Type> //定义模板
inline bool getArg(string key,Type &value = Type())
{
map<string,string>::iterator it = arguments.find(key);
if(it != arguments.end())
{
value = transForm<Type,string>(it->second);
return true;
}
else
return false;
}
例二:利用字符串流转换类型
template
<class TypeOut,class TypeIn>
inline TypeOut transForm(TypeIn item_in)
{
stringstream temp;
TypeOut item_out;
temp << item_in;
temp >> item_out;
return item_out;
}