Почему я должен когда-либо использовать встроенный код? - PullRequest
31 голосов
/ 25 сентября 2008

Я разработчик на C / C ++, и вот пара вопросов, которые всегда сбивали меня с толку.

  • Есть большая разница между "обычным" кодом и встроенным кодом?
  • В чем главное отличие?
  • Является ли встроенный код просто «формой» макросов?
  • Какой компромисс должен быть сделан при выборе встроенного кода?

Спасибо

Ответы [ 16 ]

0 голосов
/ 25 сентября 2008

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

0 голосов
/ 25 сентября 2008

Встраивание обычно разрешено на уровне 3 оптимизации (-O3 в случае GCC). В некоторых случаях это может привести к значительному улучшению скорости (когда это возможно).

Явное встраивание в ваши программы может повысить скорость за счет увеличения размера кода.

Вы должны увидеть, какой из них подходит: размер кода или скорость, и решить, стоит ли включать его в свои программы.

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

0 голосов
/ 25 сентября 2008

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

0 голосов
/ 25 сентября 2008

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

Классическим примером хорошего кандидата на встраивание являются геттеры для простых конкретных классов.

CPoint
{
  public:

    inline int x() const { return m_x ; }
    inline int y() const { return m_y ; }

  private:
    int m_x ;
    int m_y ;

};

Некоторые компиляторы (например, VC2005) имеют опцию агрессивного встраивания, и вам не нужно указывать ключевое слово «inline» при использовании этой опции.

0 голосов
/ 25 сентября 2008

«inline» подобен 2000-му эквиваленту «register». Не беспокойтесь, компилятор может решить, что оптимизировать лучше, чем вы.

0 голосов
/ 25 сентября 2008

Если вы отмечаете свой код как встроенный в т. Е. C ++ вы также говорите своему компилятору, что код должен выполняться inline, т.е. этот блок кода будет «более или менее» вставлен там, где он вызывается (таким образом, удаляя нажатия, выталкивания и прыжки в стеке). Итак, да ... рекомендуется, если функции подходят для такого поведения.

...