首页 > 解决方案 > 关键字 - 内联 - 真的强制编译器在多个地方替换它吗?

问题描述

我有以下代码:

static inline void print(const std::string& value)
{
    std::cout<< value <<std::endl;
}

上面的函数真的强制编译器在多个地方替换它吗?我想知道它是否真的有用?

由于关键字 inline 的这种含义是非绑定的,因此编译器可以自由地对任何未标记为 inline 的函数使用内联替换,并且可以自由地生成对任何标记为 inline 的函数的函数调用。这些优化选择不会改变上面列出的关于多个定义和共享静态的规则。

内联参考

标签: c++inline

解决方案


编译器的优化器很复杂,会使用启发式方法来决定是否内联代码。该决定涉及许多因素,并且inline可能会考虑使用。存在诸如 MSVC 之类的东西__forceinline,它们可能会对该决定产生更大的推动作用,但仍不能保证。

但总的来说,您可以相信编译器会做出正确的决定,并且在功能上对您没有任何影响。您可以使用递归,获取该函数的地址,编译器将使其工作,无论是否内联。

最大的实际区别是@arnes 所说的:

它允许在不同的翻译单元中多次定义函数,但编译器希望所有定义都相同(否则会导致未定义的行为)


推荐阅读