实例化内联 class 方法

Instantiate inline class method

我写了一个库,这个库包含一个函数void f()这个函数是一个单行函数,当我使用 -O3 gcc 优化标志将库编译为共享对象时,它是内联的。我在代码的关键位置调用它(必须尽可能快)并且我不想调用它而不是内联(显着影响性能)。问题是这个函数是我的库公开的 API 的一部分,所以当库用户 link 使用我的库并调用这个函数时,他们会得到未定义的引用 linkage 错误。有没有办法让我的代码使用内联函数,但仍然在目标文件中实例化它,以便库用户能够 link 并使用它? (当我说 "instantiate it in the object file" 时,我的意思是我想在共享对象上 运行 objdump -t 时看到它)。澄清一下,我对用函数包装它的解决方案不感兴趣

void F() __attribute__((noinline)) { f(); }

因为我有很多这样的函数,而且由于开销巨大,我不想为每个函数都保留一个副本。我正在寻找一种方法来告诉编译器在定义可用时内联使用它,但仍然在目标文件中实例化函数,因此库用户也可以 link 使用它。

看看这个 How can I tell gcc not to inline a function? 我发现这个解决方案最合适。我想指出的主要是库中的代码仍然是内联的,因此没有性能损失,但用户仍然可以使用 API 因为所有函数都有实例化

编译级别的另一种可能解决方案是使用 -fkeep-inline-functions gcc 开关,它也实例化内联函数并在可能的情况下内联使用它们(与 -fno-inline 开关不同)。这个开关的主要问题是,如果你的代码是大量模板化的,编译时间会更长,二进制产品也会变得更大