inline函数在IAR中的使用

1、什么叫inline函数

inline其实是是C++关键字(但是IAR支持),在函数声明或定义中,函数返回类型前加上关键字inline,即可以把函数指定为内联函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。用空间换效率。在调用inline函数时,编译器将函数在调用处展开,而不是直接调用。这种方式有点儿类似于宏定义。

优点是可以减少函数调用时间,和入栈出栈操作,也减少了栈空间的使用。

缺点是增加了代码空间,因此通常不在inline函数中执行太多的代码。也不能在inline函数中进行递归(自己调用自己)。

2. IAR中的inline函数

inline函数传统上只有C++支持,但IAR EW也支持在C代码中使用inline.

#pragma
inline:建议编译器对紧随其后的函数进行inline处理

#pragma
inline = forced: 强制编译器对紧随其后的函数进行inline处理

// tft.c中定义内联函数

#pragma inline = forced          //强制inline

void TFT_Write_Colour(const RGB_COLOUR *rgb)

{

//...code....

}

// tft.h中声明函数

void TFT_Write_Colour(const RGB_COLOUR *rgb);

// main.c中调用函数

// 编译报错:main中引用了未定义的外部函数TFT_Write_Colour。

// tft.h中“定义函数”

#pragma inline = forced          //在IAR EW430中,这里必须用强制inline;用inline可能导致编译器忽略内联,而定义成普通函数而出错。

void TFT_Write_Colour(const RGB_COLOUR *rgb)

{

//...code....

}

// main.c中包含tft.h,并调用函数

// 结果:编译正确

不过在IAR IDE下使用inline 定义的函数很多时候不会如程序设计者所愿的内联到代码中,会仍旧以函数调用的形式存在。inline关键词本身就是推荐编译器进行内联,不过编译器不接受推荐,那么自然就没用了。IAR IDE在采用默认设置时是不接受inline建议的,想让其按照程序设计者的意愿内联函数的话,需要在优化选项中进行设置。

设置选项在:Options->C/C++ Compiler->Optimizations。

只有把优化等级开到High才能在右边的Enable复选框中选择Function inlining。选择这两个之后inline定义的函数就可以正常的在汇编代码中结合在一起,不过因为是开了优化,有些并没有inline定义的函数也会被内联。不过编译器的智能程度还是比较喜人的,目前没发现什么特别差的优化结果。

原文地址:https://www.cnblogs.com/looner/p/11494491.html

时间: 2024-08-24 01:23:02

inline函数在IAR中的使用的相关文章

C++中inline函数

(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int secend) {/****/}; inline 函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定义.当然,对于同一程序的不同文件,如果inline函数出现的话,其定义必须相同.对于由两个文件comput

inline函数的使用方法

 inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义如下: #define ExpressionName(Var1,Var2) ((Var1)+(Var2))*((Var1)-(Var2)) 为什么要取代这种形式呢,且听我道来: 1. 首先谈一下在C中使用这种形式宏定义的原因,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作,因此,效率很高,这是它在C中

c++ inline函数

ref:http://www.cnblogs.com/berry/articles/1582702.html (一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int secend) {/****/}; inline 函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件

C++ inline 函数

(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int secend) {/****/}; inline 函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定义.当然,对于同一程序的不同文件,如果inline函数出现的话,其定义必须相同.对于由两个文件comput

【转载】C++ inline 函数

(一)inline函数(摘自C++ Primer的第三版) 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline int min(int first, int secend) {/****/}; inline 函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函数不同的是,inline函数必须在调用该函数的每个文本文件中定义.当然,对于同一程序的不同文件,如果inline函数出现的话,其定义必须相同.对于由两个文件comput

关于代码优化中inline函数的使用

先说说内联函数的优点:    将函数改写成inline函数, 可以避免当函数被调用时所发生的堆栈操作, 这自然可以提高代码的执行效率 一般将inline函数写在头文件中, 并且建议将其写在类结构之外, 也就是类结构定义的下面, 而不是写在类结构的里面.当然写在里面也没什么不行, 只是如果写在外面的话, 代码看起来更为整洁, 自然也会增加代码的易读性. 达到一目而了然. 1. 应该使用inline函数的情况:        当函数体比较小, 比如只有两三行, 可以考虑改写成inline函数    

C++中的Inline函数

在大多数机器上,函数调用does a lot of work:在调用函数前保存寄存器,调用结束后利用寄存器恢复现场:需要复制函数参数:程序跳转到新的位置执行... 内敛函数(inline function)则没有这个问题,简单的我们可以这样理解:Inline即“In line” 为什么说“In line”呢,先看内敛函数的声明: // inline version: find the shorter of two strings inline const string & shorterStri

matlab中关于函数句柄、feval函数以及inline函数的解析 (转)

http://blog.sina.com.cn/s/blog_7bff755b010180l3.html MATLAB函数句柄 函数句柄(Function handle)是MATLAB的一种数据类型. 包含了函数的路径.函数名.类型以及可能存在的重载方法: 引入函数句柄是为了使feval及借助于它的泛函指令工作更可靠:使“函数调用”像“变量调用”一样方便灵活:提高函数调用速度,特别在反复调用情况下更显效率:提高软件重用性,扩大子函数和私用函数的可调用范围:迅速获得同名重载函数的位置.类型信息.

inline函数不能在for循环中使用的原因

inline函数的作用继承了宏定义的优点,没有了参数压栈,代码生成等一部分操作,并且摒弃了没有检查编译规则的缺点: 另外要注意,内联函数一般只会用在函数内容非常简单的时候,这是因为,内联函数的代码会在任何调用它的地方展开,如果函数太复杂,代码膨胀带来的恶果很可能会大于效率的提高带来的益处.内联函数最重要的使用地方是用于类的存取函数. 原因1: inline实际上“相当于”宏替换,就是把函数的二进制代码直接复制到调用的地方,因而inline代码不应该有跳转.而循环结构无法避免条件跳转,所以有循环的