在什么情况下适宜采用inline定义内联函数

在什么情况下适宜采用inline定义内联函数,第1张

使用高度频繁,而且 *** 作内容简单的情况下,用inline函数。这样可以解决一些频繁调用的函数大量消耗栈空间(栈内存)的问题。关键字inline必须与函数定义放在一起才能使函数成为内联函数,仅仅将inline放在函数声明前面不起任何作用。inline是一种“用于实现”的关键字,而不是一种“用于声明”的关键字。

inline定义格式

一、inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。

表达式形式的宏定义如:

#define ExpressionName(Var1,Var2) ((Var1)+(Var2))((Var1)-(Var2))

取代这种形式的原因如下:

1、C中使用define这种形式宏定义的原因是因为,C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的 *** 作。因此,效率很高,这是它在C中被使用的一个主要原因。

2、这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型。这样,它的使用就存在着一系列的隐患和局限性。

3、在C++中引入了类及类的访问控制,这样,如果一个 *** 作或者说一个表达式涉及到类的保护成员或私有成员,你就不可能使用这种宏定义来实现(因为无法将this指针放在合适的位置)。

4、inline推出的目的,也正是为了取代这种表达式形式的宏定义,它消除了宏定义的缺点,同时又很好地继承了宏定义的优点。

扩展资料

内联函数的不足

除了通常使用内联扩展可能带来的问题,作为一种编程语言特性的内联函数也可能并没有看起来那么有效,原因如下:

1、通常,设计编译器的程序设计者比大多数的程序设计者更清楚对于一个特定的函数是否合适进行内联扩展;一些情况下,对于程序员指定的某些内联函数,编译器可能更倾向于不使用内联甚至根本无法完成内联。

2、对于一些开发中的函数,它们可能从原来的不适合内联扩展变得适合或者倒过来。尽管内联函数或者非内联函数的转换易于宏的转换,但增加的维护开支还是使得它的优点显得更不突出了。

3、对于基于C的编译系统,内联函数的使用可能大大增加编译时间,因为每个调用该函数的地方都需要替换成函数体,代码量的增加也同时带来了潜在的编译时间的增加。

-内联函数

-inline

MATLAB中inline函数:

        就是定义一个内置函数,本质上说跟function干的是一样的事,只不过它可以直接内嵌在命令行里,不用另外单独定义function

调用方法:

1、作为示例,首先在M文件内编写如下函数:

% function operation

function [s,n] = calsum(n)

s = 0;

for i = 1:n

    s = s + i;

end

2、第一种方式直接以函数名调用,与之前我的分享《matlab中如何定义函数》一致,调用时如下就可:

>> [sa,na] = eg_sum(100)

输出:

sa =

        5050

na =

   100

3、

以函数句柄形式调用,函数名作为参数,如下所示:

>> funame = @eg_sum;

>> [sum,n] = feval(funame,100)

函数输出:

sum =

        5050

n =

   100

4、

inline函数调用格式如下所示:

>> fname = inline('sum(1:n)','n')

此时会输出:

fname =

     Inline function:

     fname(n) = sum(1:n)

首先构造函数句柄,随后就可利用feval函数计算:

>> calsum = feval(fname,100)

此时就会输出:

calsum =

        5050

5、

匿名函数调用格式: fun = @(arg1,arg2,)expr,其中expr为函数表达式,arg1、arg2、等为自变量字符串。

作为示例,如下所示:

>> fname = @(n)sum(1:n)

输出:

fname = 

    @(n)sum(1:n)

输入如下形式调用:

>> fsum = feval(fname,100)

输出信息:

fsum =

        5050

天堂之吻 在此为您解答,希望能够帮到你

1:inline函数叫内联函数。一般来说,C++函数调用的时候,是去找函数的地址,但是如果是一个很简单的函数,而且经常调用的话,这样会比较慢,所有要再函数声明的时候在前面加上inline关键字,这样当这些函数被编译的时候,在她被调用的地方,会直接被替换成函数的实现,最后当函数运行被调用的时候,就不是娶找函数地址了,这样对于短小的函数来说执行会比较快。

2:friend关键字解释为友元。在一个类中,私有变量外部是不能直接访问的。但是如果另外一个类或者函数需要访问本类的一个私有变量时,可以把这个函数或者类声明为本类的友元函数或者友元类。这样他们就可以直接访问本类的私有变量。

可以不声明成静态的,另一方面虽然内联函数可以加快调用的速度,但是调用次数多的话,会使可执行文件变大,这样会降低速度。static修饰的内联函数,一般情况下不会产生函数本身的代码,而是全部被嵌入在被调用的地方。如果不加static,则表示该函数有可能会被其他编译单元所调用,所以一定会产生函数本身的代码。

inline说明符(inline specifier)在C++17前用于声明一个函数为内联函数, C++17起可用于声明内联变量。“inline”为C++语言的一个关键字。

inline说明符在用于函数的“声明说明符序列”时,将函数声明为一个内联函数。

(1)内联函数的作用

(2)注意事项

内联是以代码膨胀复制为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码, 将使程序的总代码量增大,消耗更多的内存空间。

不宜使用内联函数的情况:函数体内代码过长或者有循环语句。这样的情况下,使用内联函数往往开销更大。

(3)隐式内联函数的情况

(4)细节知识

从C++17起,关键字 inline 对于函数的定义已经变为“允许多次定义”而非“优先内联”,因此该含义扩展到了变量。

inline说明符,在用于具有静态存储期的变量(静态类成员或命名空间作用域变量)的“声明说明符序列”时,将变量声明为内联变量。声明为constexpr的静态成员变量(非命名空间作用域变量)是隐式的内联变量。

inline变量的主要作用是 即使定义的全局对象被多个文件引用也只会有一个全局对象,即内联变量是唯一的。inline变量将隐式声明为extern(外部链接)。

内联变量消除了将C++代码打包为唯头文件的库的主要障碍。

inline变量和thread_local组合可以为每一个线程定义一个属于线程自己的内联变量(thread_local是C++11增加的关键字)。如:

inline变量为C++17核心语言功能特性,于提案 P0386R2 (见文档:http://wwwopen-stdorg/jtc1/sc22/wg21/docs/papers/2016/p0386r2pdf) 中提出。各编译器支持情况见下表:

从C++17标准起,可通过判断宏 __cpp_inline_variables 是否被定义来判断编译器是否支持内联变量,比如:

内联函数或内联变量具有以下性质:

(1)在程序中可有多次定义,只要每个定义都出现在不同的翻译单元中(对于非静态的内联函数和变量)且所有定义等同即可。例如,内联函数或内联变量可定义于被多个源文件所#include的头文件中。

(2)必须在每个翻译单元中都被声明为inline。

(3)在每个翻译单元中都拥有相同的地址。

内置函数是为了提高程序效率而使用的,一般用于短小但频繁执行的这样的函数,使用内置函数用inline做声明后,预处理时会将声明的内置函数直接嵌入到main函数中去,这样能够提高程序执行效率。

比如:

声明一个内置函数

inline void funtion()

{

cout <<"This is inline function";

}

然后在main中调用它

int main()

{

function();

}

预处理时系统会把内置函数全部拷贝到main函数内,这就相当于main变成了

int main()

{

void funtion()

{

cout <<"This is inline function";

}

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/12162926.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存