Как компилятор вычисляет, какая функция должна быть встроенной, поскольку встроенный запрос не является обязательным? Какие функции я должен сделать встроенным?
Дополнительный вопрос. Могу ли я сделать встроенный звонок?
void func{} // normal (not-inline) function
int main()
{
func(); // normal call
// inline func(); // inline call
return 0;
}
Как компилятор вычисляет, какая функция должна быть встроенной, поскольку встроенный запрос не является обязательным?
(из wiki) В различных версиях языков программирования C и C++ встроенная функция является функцией, от которой компилятор был запрошен для выполнения встроенного расширения. Другими словами, программист запросил, чтобы компилятор вставлял полный кусок функции в каждое место, вызываемое функцией, а не генерировал код для вызова функции в одном месте, где он определен. Составители не обязаны соблюдать этот запрос.
В C++ вы можете использовать __forceinline
слово __forceinline
чтобы программист мог заставить компилятор __forceinline
функцию, но неизбирательное использование __forceinline
может привести к увеличению кода (раздутый исполняемый файл), минимальному или отсутствующему усилению производительности, а в некоторых случаях даже потеря производительности.
Какие функции я должен сделать встроенным?
Небольшие функции. Это хорошая идея, чтобы определить малые (как в одном лайнере) функции в файле заголовка, поскольку он дает компилятору больше информации для работы с оптимизацией кода. Это также увеличивает время компиляции.
Выйти Когда мне нужно написать ключевое слово 'inline' для функции/метода? для получения дополнительной информации.
Могу ли я сделать встроенный звонок?
inline
может использоваться только в объявлении функции, а не при вызове. Вам просто нужно вызвать предопределенную встроенную функцию как обычные функции. Когда вы отмечаете функцию inline
вы сообщаете компилятору, что эта функция должна быть встроена. На (хороших) компиляторах это ни гарантирует, что это будет, так и отсутствие гарантии не будет.
Все вложение функции выполняет замену вызова функции с телом кода. Поэтому, пока вы не можете предложить, где компилятор должен встроить функцию, вы, очевидно, могли бы на самом деле вставить код (или использовать макрос для обеспечения того, чтобы код оставался прежним). Но для этого вам понадобится действительно хорошая/нечетная причина.
В общем, отмечайте небольшие функции как встроенные, если хотите, но в остальном оставьте это в компиляторе.
То, что делает inline
, рекомендует компилятору заменить любые вызовы этой функции на фактический код функции, как сказал Т. Кили некоторое время назад. Компилятор не должен этого делать, но если это так, то это происходит:
Если у вас есть эта функция:
inline int addtwo(int i)
{
return i+2;
}
компилятор заменит все утверждения, подобные
cout<<addtwo(x)<<endl;
с
cout<<(x+2)<<endl;
Если ваша функция была длиннее нескольких строк, размер готового исполняемого файла увеличивался бы, поскольку каждый вызов был бы заменен на весь код функции. (Какие еще недостатки есть?)
inline
- для функций, которые тривиально короткие (1 строка).
inline
не говорит компилятору делать это для всех вызовов, как говорится в вопросе и в некоторых других ответах.