Каков критерий, чтобы быть встроенным

0

Как компилятор вычисляет, какая функция должна быть встроенной, поскольку встроенный запрос не является обязательным? Какие функции я должен сделать встроенным?

Дополнительный вопрос. Могу ли я сделать встроенный звонок?

void func{} // normal (not-inline) function

int main()
{
  func();           // normal call
  // inline func(); // inline call
  return 0;
}
  • 1
    Просто проверьте документацию для вашего компилятора (как на синтаксис, так и на применимость). Он сообщит вам, когда будет встроен вызов функции. Кстати, синтаксис в закомментированной строке недопустим. В общем, полезно встроить небольшую / быструю функцию: если выполнение функции занимает 1 секунду, то для сохранения 10 нс для вызова функции это довольно бесполезно.
  • 0
    @Adriano Adriano спасибо, я знаю, поэтому я это прокомментировал)
Показать ещё 7 комментариев
Теги:
inline

3 ответа

2
Лучший ответ

Как компилятор вычисляет, какая функция должна быть встроенной, поскольку встроенный запрос не является обязательным?

  • (из wiki) В различных версиях языков программирования C и C++ встроенная функция является функцией, от которой компилятор был запрошен для выполнения встроенного расширения. Другими словами, программист запросил, чтобы компилятор вставлял полный кусок функции в каждое место, вызываемое функцией, а не генерировал код для вызова функции в одном месте, где он определен. Составители не обязаны соблюдать этот запрос.

    В C++ вы можете использовать __forceinline слово __forceinline чтобы программист мог заставить компилятор __forceinline функцию, но неизбирательное использование __forceinline может привести к увеличению кода (раздутый исполняемый файл), минимальному или отсутствующему усилению производительности, а в некоторых случаях даже потеря производительности.

Какие функции я должен сделать встроенным?

  • Небольшие функции. Это хорошая идея, чтобы определить малые (как в одном лайнере) функции в файле заголовка, поскольку он дает компилятору больше информации для работы с оптимизацией кода. Это также увеличивает время компиляции.

    Выйти Когда мне нужно написать ключевое слово 'inline' для функции/метода? для получения дополнительной информации.

Могу ли я сделать встроенный звонок?

  • Вы не можете сделать встроенный вызов, поскольку inline может использоваться только в объявлении функции, а не при вызове. Вам просто нужно вызвать предопределенную встроенную функцию как обычные функции.
6

Когда вы отмечаете функцию inline вы сообщаете компилятору, что эта функция должна быть встроена. На (хороших) компиляторах это ни гарантирует, что это будет, так и отсутствие гарантии не будет.

Все вложение функции выполняет замену вызова функции с телом кода. Поэтому, пока вы не можете предложить, где компилятор должен встроить функцию, вы, очевидно, могли бы на самом деле вставить код (или использовать макрос для обеспечения того, чтобы код оставался прежним). Но для этого вам понадобится действительно хорошая/нечетная причина.

В общем, отмечайте небольшие функции как встроенные, если хотите, но в остальном оставьте это в компиляторе.

0

То, что делает inline, рекомендует компилятору заменить любые вызовы этой функции на фактический код функции, как сказал Т. Кили некоторое время назад. Компилятор не должен этого делать, но если это так, то это происходит:

Если у вас есть эта функция:

inline int addtwo(int i)
{
return i+2;
}

компилятор заменит все утверждения, подобные

cout<<addtwo(x)<<endl;

с

cout<<(x+2)<<endl;

Если ваша функция была длиннее нескольких строк, размер готового исполняемого файла увеличивался бы, поскольку каждый вызов был бы заменен на весь код функции. (Какие еще недостатки есть?)

inline - для функций, которые тривиально короткие (1 строка).

  • 3
    Это неправда. inline не говорит компилятору делать это для всех вызовов, как говорится в вопросе и в некоторых других ответах.
  • 0
    Я отредактировал пост, чтобы прояснить, что компилятор не должен это делать - это что-то не так?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню