В чем разница между макросом и встроенной функцией в отношении скорости выполнения? - PullRequest
4 голосов
/ 21 января 2011

Как complier обрабатывает встроенные функции над макросами для сокращения времени выполнения?

Ответы [ 8 ]

10 голосов
/ 21 января 2011

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

1 голос
/ 24 марта 2012

А также, у MACROS нет доступа к переменным члена класса.Это не понимает область видимости.Здесь полезны встроенные функции.

1 голос
/ 21 января 2011

Самое важное, что следует здесь отметить, это то, что макрос - это подстановка чистого текста , выполняемая препроцессором Компилятор (после этапа предварительной обработки) не знает и не заботится о том, что такое макрос.

Пример:

//this:
#define PRINT(s) std::cout << s;

int main(int, char**)
{
  PRINT("hello world")
  return 0;
}

//Will have identical codegen(in the same compiler version of course) to this:

int main(int, char**)
{
  std::cout << "hello world";
  return 0;
}

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

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

1 голос
/ 21 января 2011

Встроенные функции очень похожи на макросы, потому что они оба раскрываются во время компиляции, но макросы раскрываются препроцессором, а встроенные функции анализируются компилятором.

0 голосов
/ 15 сентября 2013

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

0 голосов
/ 08 июня 2012

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

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

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

Еще одна вещь, о которой следует помнить, это то, что макросы раскрываются во время предварительной компиляции, поэтому вы не можете использовать их для отладки.Однако для встроенных функций это не так.

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

0 голосов
/ 12 февраля 2012
         Inline Function                                        Macros
  1. Встроенные функции анализируются компилятором |1. макросы обрабатываются препроцессором.
  2. встроенная функция может быть записана внутри |2. макросы не могут быть записаны внутри.класс.|
  3. встроенная проверка типа strick |3. макросы не выполняют строгую проверку.
  4. встроенная функция выполняется по ключевому слову.|4. где макросы обрабатываются #include |, define.
  5. Встроенная функция, содержащая аргумент: |5. макросы, содержащие выражение, должны быть обработаны один раз, а затем могут быть использованы многие |обрабатывается каждый раз, когда они используются.время.|
0 голосов
/ 21 января 2011

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

...