问题描述
当一个涉及线程操作并标记为内联的函数时,我想弄清楚C ++编译器的行为。
inline Vec3 Pos() {
unique_lock lock(mutex_);
return pos_;
}
如果某些客户代码调用了该代码,编译器是否会内联代码(即展开代码)?如果可以,展开的版本是什么?没有范围或范围?
解决方法
在机器代码中,没有像“作用域”之类的东西。 “范围”是语言概念,它定义了变量的生存期。
在C / C ++中,现在有了“ AS IF规则”,这意味着编译器有权对代码进行任何转换,只要其所有可见结果保持不变即可。因此,“作用域”的效果必须保持不变。
过去的inline
关键字的意思是“确保将此代码插入到呼叫者代码中”。如今,这意味着“如果发现此功能已重新定义,请不要报告错误”。编译器可以将此函数代码插入调用者代码中,但这不是必须的。