Будет этот код:
inline int funcA(int a) __attribute__((always_inline))
{
return a + 1;
}
inline int funcB(int b) __attribute__((always_inline))
{
return funcA(b + 2);
}
int main()
{
return funcB(3);
}
преобразованный для кодирования как это?:
int main()
{
return ((3) + 2) + 1;
}
GCC, ARM (iPhone)
Инлайнинг вызовов функций - это не то, что язык требует от компиляторов. Это вопрос качества реализации (QoI). Но любой из GCC, MSVC и clang сделает это. Конечно, необходимо включить оптимизацию.
Например
# clang++ -cc1 -emit-llvm -O2 -o - main.cpp
define i32 @main() nounwind readnone {
entry:
ret i32 6
}
При использовании inline
нет никаких гарантий. Оно служит лишь подсказкой компилятору (который во многих (не во всех) случаях имеет больше эвристики и лучше понимает влияние инлайнинга, чем программист).
Не обязательно. Это зависит от компилятора и настроек, я думаю. На самом деле в C++, например, даже не гарантировано, что this
inline int funcA(int a)
{
return a + 1;
}
int main()
{
return funcA(3);
}
будет преобразован в this
int main()
{
return 3 + 1;
}
inline - это просто подсказка для компилятора. Компилятор может его проигнорировать.