通常说,只有在编译时知道它将如何被调用,或者为此产生某种效果时,才能内联函数。 (如果我错了,请纠正/澄清)
所以说如果我有这样的功能
void Calling()
{
if (m_InputState == State::Fast) //m_inputstate is a class member and is set by user
{
CallFastFunction();
}
else if (m_InputState == State::Slow)
{
CallSlowFunction();
}
}
因为m_inputstate是由最终用户设置的,我们可以说这个变量在编译时是不知道的,因此调用()不能内联吗?
答案 0 :(得分:3)
内联与编译时已知的函数输入无关。
答案 1 :(得分:1)
编译器可以(并且几乎肯定会)内联您的Calling
函数。根据{{1}}和CallFastFunction
来源的可用性,也可以内联这些内容。
如果编译器可以确定CallSlowFunction
的值,它将删除m_InputState
- 但前提是它确定值是一个值。
例如,if
只会在“慢”调用中编译,没有任何条件代码,thing.m_InputState = State::Slow; thing.Calling();
当然不会。
如果通过基于配置文件的优化,编译器知道每个案例的选择频率,它还可以选择哪个路径按照代码的顺序“下一个”结束,这样最有可能首先出现(和它还可以向处理器提供前缀或其他指示“你可能会这样”。
但内联本身的基础是:
现代编译器还支持“链接时优化”,其中生成的目标文件只是“半完成”,这样链接器实际上会生成最终代码,它可以移动代码并内联,就像老式编译器,在构成可执行文件的整个代码上(所有代码都使用链接时优化),允许在头文件中没有相同源文件的代码仍然内联。
答案 2 :(得分:0)
m_InputState
未知的事实不会阻止Calling()
内联。
通常,如果你想要一个函数是无法使用的,那么它必须在调用它的同一个.cpp文件中声明(没有函数原型)。这取决于编译器。