前言
cpu验证中创建内联函数
一、存储类别?
可以用存储期(storage duration)描述对象, 所谓存储期是指对象在内存中保留了多长时间。如果对象具有静态存储期,那么它才程序的执行期间一直存在。文件作用域变量具有静态存储期。注意,对于文件作用域变量,关键字static表明了其链接属性,而非存储期。以static声明的文件作用域变量具有内部链接。但是无论是内部链接还是外部链接,所有的文件作用域变量都具有静态存储期。
二、内联函数?
通常,函数调用都有一定的开销, 因为函数的调用过程包括建立调用、传递参数、跳转到函数代码并返回。把函数变成内联函数, 编译器可能会用内联代码替换函数调用, 并执行一些其他的优化, 但是也可能不起作用。
三、创建内联函数
创建内联函数的定义有多种方法,标准规定具有内部链接的函数可以成为内联函数, 还规定了内联函数的定义与调用该函数的代码必须在同一个文件中。因此,最简单的方法是使用函数说明符 inline和存储类别说明static。通常,内联函数应定义在首次使用它的文件中,所以内联函数也相当于函数原型。
代码如下(示例):
#include <stdio.h>
__attribute__((always_inline))
static inline void read_performance_cnt(void) //inline function definition/prototype
{
...
read_csr(PERFORMANCE_CNT);
...
}
int main()
{
...
read_performance_cnt(); //function call
...
}
内联函数前面的修饰__attribute__((always_inline))是强制内联的意思,所有加了该修饰的函数在被调用的时候会被直接扩展到调用函数体内。
编译器查看内联函数的定义(也是原型), 用函数体中的代码替换read_performance_cnt()函数调用。也就是说,效果相当于在函数调用的位置输入函数体中的代码。
内联函数应该比较短小,把较长的函数变成内联并未节约多少时间,因为执行函数体的时间比调用函数的时间长得多。