c++ 函数内嵌在编译时决定
c++ function inling decided at compile time
人们常说,只有在编译时知道函数将如何被调用或类似的东西时,函数才能被内联。 (如有错误请correct/clarify)
所以说如果我有这样的功能
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 是由最终用户设置的,我们可以说这个变量在编译时是未知的,因此不能内联 calling() 吗?
内联与编译时已知的函数输入无关。
m_InputState
未知的事实并不能阻止 Calling()
被内联。
通常,如果您希望函数可内联,则必须在调用它的同一个 .cpp 文件中声明它(无函数原型)。不过,这在一定程度上取决于编译器。
编译器可以(而且几乎肯定会)内联您的 Calling
函数。根据 CallFastFunction
和 CallSlowFunction
来源的可用性,这些也可能被内联。
如果编译器可以确定 m_InputState
的值,它将删除 if
- 但前提是该值确定为一个值。
例如,thing.m_InputState = State::Slow; thing.Calling();
只会在 "slow" 调用中编译,没有任何条件代码,其中 std::cin >> thing.m_InputState; thing.Calling();
当然不会。
如果通过profile-based优化,编译器知道每种情况被选择的频率,它也可能select哪条路径以代码的顺序结束"next" ,这样最有可能排在第一位(并且它还可以向处理器提供前缀或其他指示 "you're likely going this way".
但是内联本身是基于:
- 代码本身可用。
- 调用函数的大小和次数。
- 我们无法知道的任意编译器决定(除非我们非常熟悉编译器的source-code)。
现代编译器也支持"link time optimisation",其中生成的目标文件只有"half-done",这样链接器实际上会生成最终代码,它可以移动代码和内联,只是与 old-fashioned 编译器相同,在构成可执行文件的整个代码上(所有使用 link-time 优化的代码),允许没有相同源文件或不在头文件中的代码仍然是内联的。
人们常说,只有在编译时知道函数将如何被调用或类似的东西时,函数才能被内联。 (如有错误请correct/clarify)
所以说如果我有这样的功能
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 是由最终用户设置的,我们可以说这个变量在编译时是未知的,因此不能内联 calling() 吗?
内联与编译时已知的函数输入无关。
m_InputState
未知的事实并不能阻止 Calling()
被内联。
通常,如果您希望函数可内联,则必须在调用它的同一个 .cpp 文件中声明它(无函数原型)。不过,这在一定程度上取决于编译器。
编译器可以(而且几乎肯定会)内联您的 Calling
函数。根据 CallFastFunction
和 CallSlowFunction
来源的可用性,这些也可能被内联。
如果编译器可以确定 m_InputState
的值,它将删除 if
- 但前提是该值确定为一个值。
例如,thing.m_InputState = State::Slow; thing.Calling();
只会在 "slow" 调用中编译,没有任何条件代码,其中 std::cin >> thing.m_InputState; thing.Calling();
当然不会。
如果通过profile-based优化,编译器知道每种情况被选择的频率,它也可能select哪条路径以代码的顺序结束"next" ,这样最有可能排在第一位(并且它还可以向处理器提供前缀或其他指示 "you're likely going this way".
但是内联本身是基于:
- 代码本身可用。
- 调用函数的大小和次数。
- 我们无法知道的任意编译器决定(除非我们非常熟悉编译器的source-code)。
现代编译器也支持"link time optimisation",其中生成的目标文件只有"half-done",这样链接器实际上会生成最终代码,它可以移动代码和内联,只是与 old-fashioned 编译器相同,在构成可执行文件的整个代码上(所有使用 link-time 优化的代码),允许没有相同源文件或不在头文件中的代码仍然是内联的。