"inline"函数定义的目的是什么?
What is the purpose of an "inline" function definition?
可能重复:
C++中内联函数的好处?
有什么区别
#include <iostream>
using namespace std;
int exforsys(int);
void main( )
{
int x;
cout << "n Enter the Input Value: ";
cin>>x;
cout << "n The Output is: " << exforsys(x);
}
int exforsys(int x1)
{
return 5*x1;
}
和
#include <iostream>
using namespace std;
int exforsys(int);
void main( )
{
int x;
cout << "n Enter the Input Value: ";
cin>>x;
cout << "n The Output is: " << exforsys(x);
}
inline int exforsys(int x1)
{
return 5*x1;
}
我想这两个定义对代码来说是一样的,那么使用内联函数定义有什么好处呢?
inline
关键字向编译器建议内联函数。通常,当调用函数时,寄存器的当前内容是pushed
(复制(到内存。一旦函数返回,它们就是popped
(复制回(。
这需要一点时间,尽管通常很少,所以无论函数做什么,都会使函数调用开销相形见绌。偶尔,当一个非常小的函数在一个紧密的循环中每秒被调用数千次时,所有这些函数调用的组合函数调用开销可能会相加。在这些情况下,程序员可以向编译器建议,将函数的内容直接放入循环中,而不是调用该循环中的函数。这样可以避免开销。
某些编译器,特别是Microsoft Visual C++,会忽略inline
关键字。微软相信他们的优化器足够聪明,知道什么时候应该内联一个函数。对于那些真的想要内联函数的情况,Microsoft和其他供应商有时会提供专有的"不,我真的是认真的!"关键字。在Visual C++的情况下,如果我没记错的话,它是__forceinline
。然而,即使这样,如果优化器强烈认为内联该函数是个坏主意,仍然可以忽略这一点。
由于编译器足够聪明,可以决定哪些函数将从内联中受益,而哪些函数不会受益,inline
唯一真正的效果是更改函数链接。默认情况下,inline
函数具有外部链接。
inline
关键字只是对编译器的一个建议。编译器可以决定内联未声明inline
的函数,或者不内嵌声明inline
的函数。
好吧,内联函数的代码在编译时被放置在其使用位置。因此,它的执行速度有点快,并且源代码长度保持较小。
内联函数调用实际上被内联函数本身所取代。
这就优雅而简单地解释了这一点。http://www.cprogramming.com/tutorial/lesson13.html
维基百科的文章也很有帮助。http://en.wikipedia.org/wiki/Inline_function
来自C++语言规范7.1.2
带有内联说明符的函数声明声明内联作用内联说明符向实现指示函数体在调用点的内联替换是优选于通常的函数调用机制。
这意味着实现可以用方法体替换方法调用,从而避免了通常在普通方法调用过程中发生的开销。但内联替换并不是强制性的,它是特定于实现的。
执行此内联替换不需要实现在呼叫点;但是,即使此内联替换省略,7.1.2定义的内联函数的其他规则应仍然受到的尊重
当您调用内联函数时,预处理器不会将执行控制转移到此函数,而是用实际的函数代码替换所有此类函数调用。在C++中,当您在类中定义函数时,默认情况下它是内联的,前提是它没有循环语句。
- C++中"dependent name"的定义是什么?
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- Qt - QVector 和模型视图 - 从列表视图获取自定义类的最佳方法是什么?
- 在模板类之外定义友元函数的正确方法是什么?
- 在自定义 std::vector-like 容器中处理指针和非指针模板类型的最佳方法是什么?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 自定义数据结构的优点是什么?
- [未定义提及'SetLastError@4']是什么意思?
- 在C++中,创建'n'数量的对象的推荐方法是什么,其中n是用户定义的。我该怎么做?
- 此模板定义在 C++ 中是什么意思?
- 根据 c++ 标准在该宏定义中推送/弹出宏时的行为是什么
- 私有在函数定义/实现的返回值范围内是什么意思 (c++)?
- 这种错误的原因是什么:将"功能"重新定义为不同类型的符号
- 朋友定义函数的名称空间是什么
- 对struct::struct的未定义引用是什么意思
- c++ 17 中结构自动定义构造函数的规则是什么?
- 在 .text 部分中定义只读数据的原因是什么?
- 将字段(在类中)定义为引用的缺点是什么?
- (.text+0x20):对"主要"的未定义引用是什么意思
- Arduino IDE中自定义库类的.h文件编译错误的原因是什么