如何在调用位置替换内联函数代码
how Inline function code is replaced in calling place?
我想知道内联函数调用是如何被内联代码取代的。我在某本书上读到,编译器可能会把内联函数当作普通函数。
来自c++常见问题解答:
当编译器内联展开函数调用时,该函数的代码插入到调用者的代码流中(概念上类似于#define宏会发生什么?这取决于无数的因素其他方面,提高性能,因为优化器可以程序集成被调用的代码-优化被调用的代码调用者。
有几种方法可以指定一个函数是内联的其中包括内联关键字,其他的没有。无论你如何将一个函数指定为内联函数,这是编译器的一个请求允许忽略:它可以内联展开部分、全部或不展开调用内联函数。(不要气馁,如果这看起来无可救药地模糊。以上的灵活性其实是巨大的优点:它允许编译器以不同的方式处理大型函数小的,加上它让编译器生成的代码很容易如果选择了正确的编译器选项,则进行调试。)
在最简单的情况下,内联函数被放入其调用站点,就像您复制并粘贴了它一样。因此,
inline int madd( int a, int b, int c )
{
return a * b + c;
}
void foo( int data[3] )
{
int result = madd( data[0], data[1], data[2] );
printf("%dn", result); // note to pedants: this is simpler than a cout stream, so there
}
编译器可以把它转换成
void foo( int data[3] )
{
int result = data[0] * data[1] + data[2] ; // madd is replaced inline
printf("%dn", result);
}
通过内联声明一个函数,那么该函数将直接在调用它的地方被其定义所替换。它节省了执行时间,因为一般来说,普通的方法调用包括将控制转移到该函数,并以不同的方式为该函数的执行提供内存。
通过内联,函数以内联方式执行,从而消除了对函数体的控制传递。
一般情况下,通过在函数声明的返回类型前添加关键字inline,使函数成为内联的。
通过内联函数,我们可以避免函数开销,也可以节省执行时间。
Example: inline mul (int a, int b)
{
int multi;
multi = a * b;
}
通过,我们可以避免函数开销(意味着将PC存储在堆栈push &流行操作)
inline是对编译器的建议。如果编译器可以在进行其他优化的同时执行此操作,则它将内联函数,这意味着它将在调用点将函数内容"内联",从而避免堆栈创建和调用开销。然而,如前所述,这是一个建议,编译器不需要这样做
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 修改链表主函数代码,用户将在其中输入节点的索引和数据以及正确的消息
- 是否可以像这样编写c malloc函数代码
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何将C++ lambda 函数代码转换为 C#?
- 该构造函数代码如何将指针作为参数
- 调用C++具有复杂参数和复杂返回类型的函数 C 代码
- "_FCbuild"不能用作函数 - C/C++ 代码错误
- 复制赋值和复制构造函数(代码C++的差异)
- 反向链表的递归函数(代码段说明)
- 当满足条件时,是否可以在 GLSL 着色器中回调 C/C++ 函数/代码
- 在构造函数代码之前禁用默认类成员初始化
- 以下移动构造函数代码安全吗?
- C++构造函数代码..这叫什么
- 如何更改SWIG生成的CSHARP文件中的构造函数代码
- 找不到当前函数(代码::块)C++的边界
- 使用模板进行 C++ 函数代码泛化
- 编写此指针函数代码的长格式方法是什么
- C++某些构造函数代码之间的区别
- 错误C2668从站点对重载函数代码的调用不明确http://h264bitstream.sourceforge.net/