
C ++语言的函数内联机制不仅具有宏代码的效率,而且还提高了安全性,并且可以自由地操纵类的数据成员. 因此,在C ++程序中,所有宏代码都应替换为内联函数
可执行cpp文件中的功能只能定义一次. 如果在.h文件中定义函数并包含两个cpp,则将导致在两个cpp中定义函数,这将导致错误. 但是内联函数允许在多个cpp中使用多个定义,从而解决了这个问题.
for (int i=v.begin() ; i<v.size() ; i++)
{
....
}
size()调用实际上是内联的. 在循环中,可以使用变量保存v.size()的值,以减少每个循环的调用成本. 因此,我决定进行搜索,并对其进行总结.
1. 内联线索
考虑以下min()函数
int min( int v1, int v2 )
{
return( v1 < v2 << v1 : v2 );
}
为这么小的操作定义函数的好处是:

a. 如果一段代码包含对min()的调用,那么与读取条件运算符的实例相比,读取此类代码并解释其含义要容易得多.
b. 更改本地化的实现比更改应用程序中的300次事件要容易得多
c. 语义是统一的,可以保证每个测试都以相同的方式实现.
d. 功能可以重复使用,而不必为其他应用程序重写代码
但是,将min()作为函数编写有一个严重的缺点: 调用函数比直接计算条件运算符要慢得多. 如何平衡以上优势和效率? C ++提供的解决方案是一个内联(inline)函数
2. 内联原则: 代码替换
在编译程序时,编译器用内联函数的函数主体替换程序中出现的内联函数的调用表达式.
例如,如果将函数指定为内联函数,则它将在程序中的每个调用点处内联扩展. 例如

int minVal2 = min( i, j );
在编译时扩展为
int minVal2 = i < j << i : j;
消除了将min()作为函数编写的额外执行开销.
3. 内联的使用
要使函数内联,请在类中隐式定义函数,并在函数前显式添加inline关键字.
4. 内联使用一些注意事项
a. 从内联的原理可以看出函数调用 内联函数,内联的原理是以代码扩展(复制)为代价交换时间空间,仅消除了函数调用的开销,从而提高了函数有效性. 如果在函数体中执行代码的时间大于函数调用的开销,则效率增益将很小. 因此,如果函数体代码太长或函数权重包含循环语句,if语句或switch语句或递归,则不适合使用内联

b. 关键字inline必须与函数定义主体一起放置才能使函数内联. 仅将内联放在函数声明之前无效. 必须在内联函数调用之前声明.
inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y)
{
...
}
上面的代码不能是内联函数,而下面的代码可以
void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{
...
}
因此,内联是“实现的关键字”,而不是“声明的关键字”. 对于上面的示例,林睿还建议只在定义之前添加内联,而不是声明和定义,因为这可以反映出高质量C ++ / C编程风格的基本原理: 声明和定义不应混淆.
c.inline只是对编译器的建议,编译器可以选择忽略它. 换句话说,即使以内联方式编写,编译器也会自动对其进行优化,而不会出现任何错误. 因此,当内联中存在递归,循环或过多的代码时,编译器会自动忽略内联声明,并将其作为常规函数调用.
摘要:
我认为内联可以理解为C ++中特定于函数的宏,以及对C函数宏的改进. 对于常量宏,C ++提供了const替代;对于函数宏,C ++提供了内联解决方案. 在C语言中,每个人都知道宏的优点. 通过复制宏代码,编译器无需压入参数堆栈,生成程序集调用和返回参数. 虽然存在一些安全隐患,但是从效率上来说,非常可取.

但是,函数宏仍然存在许多缺陷,主要包括以下缺陷:
a. 复制代码时,很容易产生意想不到的边缘效应,例如经典的
#define MAX(a, b) (a) > (b) ? (a) : (b)
在执行语句中:
result = MAX(i, j) + 2 ;
被解释为
result = (i) > (j) ? (i) : (j) + 2 ;
b. 尽管Windows提供了ASSERT宏,但是您无法使用宏进行调试
c. 无法使用宏访问课程的私人成员
因此,C ++不仅具有宏代码的效率,而且还通过内联机制提高了安全性. 它还可以自由地操纵类的数据成员函数调用 内联函数,这是一个完美的解决方案.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-159257-1.html
中国没有不好
数据呢