Что на самом деле делает встроенная функция? [Дубликат]

0

Я искал в Интернете несколько тем, связанных с встроенными функциями, но никто из них не сомневался.

До сих пор я знаю, что встроенная функция работает так же, как метод или блок, но недавно увидела следующий ответ:

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

Таким образом, это означает, что в нормальных функциях: я был в точке А и хотел пойти в точку Б, чтобы я выбрался из А и пошел в В, верно?

Имеют встроенные функции: я был в точке A и хотел бы перейти в точку B, чтобы точка B доходила до точки A?

Что я сказал выше, правильно?

  • 2
    Объявляя встроенную функцию, вы исключаете ее из правила единого определения. Это обо всем, что гарантировано.
  • 0
    По сути, это даже не функция, это как если бы вы объявили макрос, такой как #define max (a, b). Просто безопаснее: D
Показать ещё 7 комментариев
Теги:

3 ответа

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

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

Данный:

void Print(void)
{
  cout << "Hello World!\n";
}

int main(void)
{
  Print();
  return 0;
}

Компилятор будет генерировать инструкцию сборки для вызова функции Print внутри main функции.

При объявлении функции Print inline компилятор генерирует концептуальную функцию main() ниже:

int main(void)
{
  // Substitute content of Print function because it declared as inline
  cout << "Hello World!\n";

  return 0;
}

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

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

1

Цитата должна читать "заменить вызов"..."поместить полный код". Идеал за встроенной функцией похож на макрос; в каждом месте исходного кода, вызывающего встроенную функцию, вместо вызова встроенной функции, вызов заменяется полным кодом из встроенной функции, и вызов не выполняется. Это может привести к многократному дублированию кода, но должно привести к более быстрому выполнению, если только увеличение размера кода не вызывает проблем с кешем. В некоторых случаях компилятор может игнорировать встроенную опцию и использовать обычный вызов.

0

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

inline void sayHi()
{ 
    std::cout<<"Hi!";
}
int main()
{
    sayHi();         //Calling an inline function 
    std::cin.get();
}

compiler pastes std :: cout << "Привет!"; вместо sayHi(); Так что вы сказали, что это действительно правильно.

Ещё вопросы

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