c++ - 关键字 - 内联 - 真的强制编译器在多个地方替换它吗?
问题描述
我有以下代码:
static inline void print(const std::string& value)
{
std::cout<< value <<std::endl;
}
上面的函数真的强制编译器在多个地方替换它吗?我想知道它是否真的有用?
由于关键字 inline 的这种含义是非绑定的,因此编译器可以自由地对任何未标记为 inline 的函数使用内联替换,并且可以自由地生成对任何标记为 inline 的函数的函数调用。这些优化选择不会改变上面列出的关于多个定义和共享静态的规则。
解决方案
编译器的优化器很复杂,会使用启发式方法来决定是否内联代码。该决定涉及许多因素,并且inline
可能会考虑使用。存在诸如 MSVC 之类的东西__forceinline
,它们可能会对该决定产生更大的推动作用,但仍不能保证。
但总的来说,您可以相信编译器会做出正确的决定,并且在功能上对您没有任何影响。您可以使用递归,获取该函数的地址,编译器将使其工作,无论是否内联。
最大的实际区别是@arnes 所说的:
它允许在不同的翻译单元中多次定义函数,但编译器希望所有定义都相同(否则会导致未定义的行为)
推荐阅读
- sql - 使用存储函数或存储过程返回 firebird 3.0 中的表
- flutter - 避免在firestore中重复输入
- c# - 在将结构转换为字节数组时丢失了结构中的一些字符串变量
- sql-server - 如何从 Hyper V VM 连接到在主机中运行的 SQL Server?
- php - 如何更新会话的值?
- android - Google Play 签名 SHA256 指纹发布一次后会改变吗?
- reactjs - 单击按钮清除组件列表
- angular - Angular 8 路由器重新加载整个页面而不是部分加载。为什么?
- xml - 如何使用 XSLT 打印节点属性内的参数值?
- swift - 从字符串iOS swift 5转换日期