c ++函数inling在编译时决定

时间:2016-01-27 20:51:55

标签: c++ inline

通常说,只有在编译时知道它将如何被调用,或者为此产生某种效果时,才能内联函数。 (如果我错了,请纠正/澄清)

所以说如果我有这样的功能

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是由最终用户设置的,我们可以说这个变量在编译时是不知道的,因此调用()不能内联吗?

3 个答案:

答案 0 :(得分:3)

内联与编译时已知的函数输入无关。

答案 1 :(得分:1)

编译器可以(并且几乎肯定会)内联您的Calling函数。根据{{​​1}}和CallFastFunction来源的可用性,也可以内联这些内容。

如果编译器可以确定CallSlowFunction的值,它将删除m_InputState - 但前提是它确定值是一个值。

例如,if只会在“慢”调用中编译,没有任何条件代码,thing.m_InputState = State::Slow; thing.Calling();当然不会。

如果通过基于配置文件的优化,编译器知道每个案例的选择频率,它还可以选择哪个路径按照代码的顺序“下一个”结束,这样最有可能首先出现(和它还可以向处理器提供前缀或其他指示“你可能会这样”。

但内联本身的基础是:

  1. 代码本身可用。
  2. 函数调用的大小和数量。
  3. 我们无法知道的任意编译器决策(除非我们非常熟悉编译器的源代码)。
  4. 现代编译器还支持“链接时优化”,其中生成的目标文件只是“半完成”,这样链接器实际上会生成最终代码,它可以移动代码并内联,就像老式编译器,在构成可执行文件的整个代码上(所有代码都使用链接时优化),允许在头文件中没有相同源文件的代码仍然内联。

答案 2 :(得分:0)

m_InputState未知的事实不会阻止Calling()内联。

通常,如果你想要一个函数是无法使用的,那么它必须在调用它的同一个.cpp文件中声明(没有函数原型)。这取决于编译器。