2012-05-19 1 views
1

Итак, я немного экспериментирую с компилятором (я нахожусь на этом этапе карьеры C++), и я заметил, что вызов _rotl скомпилирован/собран непосредственно; под этим я имею в виду, что вместо сборки, выполняющей call, коды кода (хотя и только 2), по-видимому, вырезаны/вставлены непосредственно там, где есть вызов.Объяснение вызова функции Inline

Какова причина этого? Я считаю, что термин «встроенная функция», но я могу ошибаться.

+0

Компилятор автоматически выполняет определенные функции для оптимизации. – chris

+0

Да, но какие функции они; что представляет собой компилятор, создающий определенную функцию? – Qix

ответ

6

Это не встроенная функция, это intrinsic function. Предназначен для использования конкретных возможностей целевого процессора. Он безоговорочно встраивается и не объявляет функцию inline, как правило, производя только одну инструкцию машинного кода. В случае _rotl(), используя инструкцию x86 ROL.

+0

Идеально, узнал новый термин! Это идея встраивания, но на стероиды (хороший вид). – Qix

+2

Erm, не переносной вид. Не всегда хорошо. –

+0

Правда, но для компилятора это не так уж плохо. От того, как они описали это по вашей ссылке, по крайней мере. – Qix

1

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

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

Операция inline'ing сама по себе копирует тело функции в любое место, где она используется, без необходимости ее называть.

Вы всегда можете найти об этом Google и найти дополнительную информацию.

EDIT: Вставка обычно происходит только/в основном с включенными оптимизациями; попробуйте включить и выключить их и сравнить разборку.

+1

Все современные компиляторы, используемые в настоящее время, игнорируют советы человека о встраивании, поскольку это, как правило, неверно. Если они не будут вынуждены следовать за человеком, они вместо этого используют свою эвристику. –

+0

Ключевое слово Inline может быть прочитано людьми, хотя иногда может улучшить читаемость кода (я думаю). –

+0

Я бы сказал, что он уменьшает читаемость, так как возникает ожидание. Вы должны использовать inline только там, где это требуется (когда требуется компоновщик для удаления нескольких копий). http://stackoverflow.com/q/1759300/14065 –

1

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

Функции обычно являются встроенными, если они вызываются в цикле, где эти служебные данные становятся более значительными. Вы можете использовать ключевое слово inline для hint компилятору, что вы хотите, чтобы функция была встроена, но компилятор не обязан это делать. Вы можете использовать ключевые слова для компилятора, чтобы иногда приводить в действие строки. Например, __forceinline с VC++.

+0

+1 для ключевого слова '__forceinline'. Есть ли противоположность '__forceinline'? – Qix

+2

@ Di-0xide: '__declspec (noinline)' будет делать обратное для функций-членов. –

 Смежные вопросы

  • Нет связанных вопросов^_^