2016-09-09 40 views
0

众所周知,对于内联函数,只要它们被调用,编译器就会用函数的主体“替换”函数的实际调用。内联变量的语义

但是,在C++ 17中提出的内联变量呢?他们的语义是什么?

回答

1

正常情况下,必须为函数和变量(为它们分配空间,变量空间或函数体代码)定义一次函数和变量。内联函数放宽了这一点,以允许多个定义(因为定义通过包含文件被拉入到多个模块中),所有这些都必须相同。如果该函数是实际引用的,而不是内联复制,则通过丢弃除一个副本以外的所有副本并使该副本成为二进制中的正式副本来合并多个定义。

行内变量对于例如:静态类成员。您不必创建一个只有内容为单个成员变量定义的类的主体源文件,而是可以在类头文件中定义静态成员变量并生成多个定义(每个模块包含一个类头)将被合并到二进制文件中的单个实例中,而不会导致编译器或链接器错误。

This paper discusses it in technical detail.

4

不,不能保证调用内联函数实际上会导致函数被内联。例如,如果内联函数递归调用自身,那么它可能不会被内联。同样,通过函数指针变量的调用通常不能被内联。

如果一个内联函数具有外部连接,然后连接,如果内联函数在多个翻译单位定义期间,链接器选择含有定义的转换单元中的一个,并解析所有剩余的引用( ODR - 不是由编译器内联的),将该函数添加到所选翻译单元中的定义中,放弃其余定义。内联变量的工作方式相同。