C内联函数和内存使用

C内联函数和内存使用,c,inline-method,C,Inline Method,如果使用内联函数,内存使用是否会增加?取决于函数。简单的一行程序可以减少内存,因为不需要设置和清理调用堆栈,也不需要进行函数调用。如果函数大于调用函数所需的开销,那么它当然会使代码膨胀。内联函数肯定会增加最终可执行文件(或二进制文件)的大小,因为它们将被“复制粘贴”到您调用它们的任何地方。通常情况下,您的程序会变大运行时内存消耗可能会下降,但不会下降很多 你为什么要问这个问题?通常,你让编译器决定一个函数是否应该内联;考虑到函数的大小和复杂性,它通常可以进行更好的调用。还有一点你必须考虑: 通过

如果使用内联函数,内存使用是否会增加?

取决于函数。简单的一行程序可以减少内存,因为不需要设置和清理调用堆栈,也不需要进行函数调用。如果函数大于调用函数所需的开销,那么它当然会使代码膨胀。

内联函数肯定会增加最终可执行文件(或二进制文件)的大小,因为它们将被“复制粘贴”到您调用它们的任何地方。

通常情况下,您的程序会变大运行时内存消耗可能会下降,但不会下降很多


你为什么要问这个问题?通常,你让编译器决定一个函数是否应该内联;考虑到函数的大小和复杂性,它通常可以进行更好的调用。

还有一点你必须考虑:

通过使用内联函数,编译器可以看到调用方的变量将被用作被调用方变量的位置。编译器可以根据这些知识优化出冗余代码(通常这是许多可以忽略的汇编代码行。请注意所谓的“别名问题”)。因此,您的“代码膨胀”通常并没有那么大,特别是如果你有更小的函数,它甚至可以减少上面Jim提到的膨胀


有人提出了一个很好的观点:最好让编译器决定是否内联有问题的函数,因为它比您更了解它生成的代码。

函数调用需要几个处理器指令

通常,函数的每个参数都需要一条PUSH指令,调用函数需要一条CALL指令,通常还需要另一条在函数调用后清理堆栈的指令

此外,函数可能会修改处理器的寄存器,因此调用函数可能需要更多指令来保留寄存器或重新加载寄存器中仍然存在的值

因此,如果您调用的函数只有几条指令长,那么将其内联可以节省内存并运行得更快


这就是说,内联是针对探查器告诉您应该进行内联的情况。

在一般情况下,这确实是不负责任的

首先,您通常无法控制内嵌。即使您将函数标记为内嵌,它实际上仍由编译器决定,它实际上会执行内嵌(这只是一个提示)

编译器将尽最大努力优化代码;使用in-Line只是其中一种工具。因此,内联短函数将使代码更小(因为您不需要设置调用参数或检索返回值。但即使使用长函数,答案也不是绝对的

如果编译器决定内联一个长函数,那么您可能会认为代码会变长。但通常情况并非如此;因为这给了编译器额外的机会来应用其他优化技术,可能会使代码变得更小。如果编译器分析发现产生的代码膨胀是有害的根据规范,衬里将不会进行

基本上,编译器进行分析并决定最佳的操作过程


结论。别担心。编译器比你聪明,会做正确的事情。

有时我们的函数分散在程序中。在这种情况下,函数调用会导致程序跳转到函数的地址,并在函数调用终止时返回。这会减少一些精度美国时间

使用内联函数可以解决上述问题。这会导致编译器直接从源代码调用代码。不会为内联函数代码创建新的内存指令集

<>虽然C++中的内联声明是自由的,但在声明中定义函数时,会自动发生,C在以下规则中受到限制::

  • 在C中,任何具有内部链接的函数都可以声明为内联,但是具有外部链接的函数对内联有限制

  • 如果在函数声明中使用内联关键字,则函数定义应存在于同一翻译单元中

  • 内联数据类型函数\u名称(参数)

    此代码比非内联函数运行高达30%的fastert,其余取决于处理器速度

    现在是策略部分。您可以随意使用内联函数,但请记住,内联函数的执行时间可能要短得多,但在运行时内存占用率很高。此外,如果内联声明的代码与代码大小相比异常大,编译器始终可以忽略内联声明


    内联声明虽然会破坏求值顺序,但不会使函数成为内部函数。函数仍然是外部函数。

    内联函数会影响两种内存使用情况:

    代码大小-通常,内联代码会增加用于加载程序的内存量。这是因为生成的代码会有多个副本分散在程序中。但是,这并不总是正确的——如果内联函数只使用了一次,则变化不大,如果内联函数在非常小的情况下,您可以通过删除函数调用开销来净减少代码大小。此外,可以通过能够删除特定内联调用中未使用的代码的优化器来减少函数的大小

    堆栈使用-如果内联函数有很多局部变量,那么您可能会使用更多的堆栈空间。在C语言中,编译器通常在函数进入时为函数分配堆栈空间。堆栈空间必须足够大,以容纳未存储在寄存器中的所有局部变量。如果调用