我发现很多资源在线都在讨论inline
(甚至__attribute__((always_inline))
或__forceinline
)如何强制编译器(例如gcc或VisualC ++)内联函数。但什么时候内联不会被强制执行?有玩具的例子吗?
也许不一定是同一个问题,在两个不同的cpp文件中包含inline
标记的函数何时会在链接期间产生问题?即,生成重复的符号?
这是一个混凝土沙箱,用于尝试破坏编译器内联并生成重复的符号:
在myinline.h
:
inline int myinline()
{
// code that cannot be inlined...
...
}
在aux.cpp
:
#include "myinline.h"
int aux()
{
return my_inline();
}
在main.cpp
:
#include "myinline.h"
int aux();
int main()
{
return aux() + my_inline();
}
然后,例如在gcc的情况下,myinline
的某些(最小)代码在编译和链接时会导致重复的符号:
g++ -o aux.o -c aux.cpp
g++ -o main.o -c main.cpp
g++ -o example aux.o main.o
答案 0 :(得分:1)
“内联”和“重复符号”是不同的东西。 inline
关键字明确允许多个定义(即它使您免于单定义规则),因此平台(编译器和链接器)必须知道如何处理和重复删除。
(这一直发生在头文件中定义的类成员函数。)
如果你只想发生代码生成,你可以在某处存储函数的地址:
auto fp = my_inline;
这样编译器必须生成函数的定义,以便能够为其提供地址。但即使您在每个翻译单元中执行此操作,也不会出现链接器错误,因为这将在链接时进行重复数据删除。所有定义都相同的要求确保这是明确定义的。