1

我发现许多在线资源都在讨论如何inline(甚至__attribute__((always_inline))__forceinline)不强制编译器(例如 gcc 或 VisualC++)内联函数。但是什么时候不强制执行内联呢?有玩具的例子吗?

也许不一定是同一个问题,inline两个不同cpp文件中包含的函数何时会在链接期间产生问题?即,生成重复的符号?

这是一个具体的沙箱,用于尝试破坏编译器内联并生成重复符号:

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

?

4

1 回答 1

1

“内联”和“重复符号”是不同的东西。关键字明确地允许多个定义(即,它使inline您免于单一定义规则),因此平台(编译器和链接器)必须知道如何处理和删除重复数据。

(对于在头文件中定义的类成员函数,这种情况总是会发生。)

如果您只想生成代码,您可以将函数的地址存储在某处:

auto fp = my_inline;

这样编译器必须生成函数的定义,以便能够给它一个地址。但即使您在每个翻译单元中都这样做,您也不会收到链接器错误,因为这将在链接时进行重复数据删除。所有定义都相同的要求确保这是明确定义的。

于 2013-11-07T18:14:57.493 回答