这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 内联函数注意事项

共10条 1/1 1 跳转至

内联函数注意事项

专家
2013-09-17 08:41:59     打赏
内联函数就是小型函数,牺牲空间来节省函数调用的开销,一般用作比较小的函数,即函数内部没有循环、开关语句等。内联函数被发明出来就是为了取代C中的宏,因为宏是单纯的替换而没有类型检查所以经常出毛病,比如:

#define MAX(a, b) (a) > (b) ? (a) : (b)

如果你在代码中这样写:

int a = 5, b = 10;

// int max = MAX(++a, b); // a自增了两次
// int max = MAX(++a, b+10); // a自增了一次

a的自增次数竟然由与其比较的数字的大小来决定!?这肯定不是你想要的结果。

所以最好的办法是这样:
template <class T>
inline T max(const T& t1, const T& t2)
{
return t1 > t2 ? t1 : t2;
}

这样的话如果你这样写:

int max = max(a, b);
其实就被替换为了:
int max = a > b ? a : b;
虽然看起来宏差不多,但是比宏多了类型检查,而且内联函数使用的是真正的函数的特性,而不是宏的function-like,模拟函数的功用。

内联函数是为频繁使用、并且过程不大的小型函数设计的,我说了它是以牺牲代码空间来节省函数调用的开销,内联函数使用不当就会造成代码膨胀,所以使用它一定要小心。

建议(书上抄的):
For function-like macros, prefer inline functions to #defines.

小贴士:

只有当函数只有 10 行甚至更少时才将其定义为内联函数.

定义:

当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.

优点:

当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键的函数, 鼓励使用内联.

缺点:

滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码大小. 现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快。

结论:

一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!

另一个实用的经验准则: 内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行).

有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联. 通常, 递归函数不应该声明成内联函数.(YuleFox 注: 递归调用堆栈的展开并不像循环那么简单, 比如递归层数在编译时可能是未知的, 大多数编译器都不支持内联递归函数). 虚函数内联的主要原因则是想把它的函数体放在类定义内, 为了图个方便, 抑或是当作文档描述其行为, 比如精短的存取函数.




关键词: c++     内敛函数    

高工
2013-09-17 09:19:59     打赏
2楼
如此一来有助于模块化的程序设计,整个功能只需调用一个函数就OK,其他的就让它嵌套调用去吧

专家
2013-09-17 09:21:50     打赏
3楼
但要综合评论时间和空间了

高工
2013-09-18 14:18:54     打赏
4楼
内联函数要注意:内联函数内不允许用循环语句和开关语句;内联函数的定义必须出现在内联函数第一次被调用之前

专家
2013-09-20 14:02:17     打赏
5楼
谢谢补充

高工
2013-09-22 21:36:59     打赏
6楼
还得多向你学习

高工
2013-09-22 22:49:34     打赏
7楼
学习了。。。。。

专家
2013-09-23 08:34:39     打赏
8楼
谦虚了你

专家
2013-09-23 08:35:02     打赏
9楼
小知识点,大家共同学习

高工
2013-09-23 23:04:30     打赏
10楼
编程的东西很多还是来自经验

共10条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]