代码之家  ›  专栏  ›  技术社区  ›  Xolve

内联函数有地址吗?

  •  16
  • Xolve  · 技术社区  · 14 年前

    在《C++程序设计语言》一书的7.1.1节中,作者陈述:

    “内联函数仍然有唯一的地址,内联函数的静态变量也是如此”

    我很困惑。如果我有一个内联函数,那么它就不能有地址。这种情况在C语言中也会发生吗?

    6 回复  |  直到 6 年前
        1
  •  37
  •   Greg Hewgill    14 年前

    这个 inline 属性只是一个 它应该尝试内联你的函数。仍然可以获取函数的地址,在这种情况下,编译器还需要发出非内联版本。

    例如:

    #include <stdio.h>
    
    inline void f() {
        printf("hello\n");
    }
    
    int main() {
        f();
        void (*g)() = f;
        g();
    }
    

    上面的代码打印出来 hello 两次。

    gcc 编译器(带 -O

    _main:
            pushl   %ebp
            movl    %esp, %ebp
            pushl   %ebx
            subl    $20, %esp
            call    ___i686.get_pc_thunk.bx
    "L00000000002$pb":
            leal    LC0-"L00000000002$pb"(%ebx), %eax
            movl    %eax, (%esp)
            call    L_puts$stub        ; inlined call to f()
            call    L__Z1fv$stub       ; function pointer call to f() (g is optimised away)
            movl    $0, %eax
            addl    $20, %esp
            popl    %ebx
            popl    %ebp
            ret
    

    正如你所看到的,首先是一个 puts() 然后打电话给 L__Z1fv() (这是 f() ).

        2
  •  6
  •   Kirill V. Lyadvinsky    14 年前

    具有外部 联动装置应具有相同的地址

        3
  •  5
  •   Scharron    14 年前

    这并不矛盾。 在使用指向函数的指针的部分中,可以创建具有地址的非内联版本。

        4
  •  3
  •   Jerry Coffin    14 年前

    函数的内联扩展没有地址,但如果该函数有静态变量,则该变量确实有地址。静态变量基本上只是一个全局变量 名称 仅在本地可见(即,在其定义的范围内)。内联函数中的其他变量可能在堆栈上分配(就像它没有内联扩展时一样),或者它们可能只存在于机器寄存器中。重要的一点是,它们仍然是独立的变量,并且必须像函数没有被内联扩展一样工作(不像宏,例如宏,在宏中需要非常小心,以防止多个求值引起问题)。

        5
  •  0
  •   codymanix    14 年前

    它们可能在某些调用位置内联,但它们仍然作为普通函数存在于地址空间中。

        6
  •  0
  •   Matt Joiner    14 年前

    我认为您混淆了内联函数对象代码的位置和内联的含义。通常,我们将内联函数可视化为放在源代码级别的调用函数中。这本书所说的是,变量名,包括内联函数中静态的使用,被视为与函数实际上是典型的独立函数一样。

    此外,使用inline关键字处理函数并不能保证它们是内联的,对于不能内联的情况(例如需要地址时),将生成非内联版本。