встроить функцию внутри другой встроенной функции в C - PullRequest
6 голосов
/ 30 июня 2010

В настоящее время у меня есть встроенные функции, вызывающие другую встроенную функцию (простую 4-строчную функцию getAbs()). Однако я обнаружил, просматривая код ассемблера, что «большие» встроенные функции хорошо встроены, но компилятор использует прыжок bl для вызова функции getAbs().

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

Редактировать: Компилятор WindRiver, и я уже проверил, что вставка будет полезна (4 инструкции вместо + -40).

Ответы [ 5 ]

8 голосов
/ 30 июня 2010

В зависимости от того, какой компилятор вы используете, вы можете поощрять компилятор к меньшему нежеланию встроенного, например, с gcc вы можете использовать __attribute__ ((always_inline)), с Intel ICC вы можете использовать icc -inline-level=1 -inline-forceinline, а с gcc от Apple вы можетеможно использовать gcc -obey-inline.

8 голосов
/ 30 июня 2010

Ключевое слово inline - это предложение для компилятора, ничего более.Можно свободно принять это предложение на борт, полностью проигнорировать его или даже солгать вам и сказать, что оно делает это, хотя на самом деле это не так.

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

Современные компиляторы более чем способны генерировать лучший код, чем большинство разработчиков могли бы сделать вручнуюсборка.Я думаю, что ключевое слово inline должно идти по тому же пути, что и ключевое слово register.

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

Кроме того, проверьте this , какие оптимизации на самом деле имеет gcc,включая большое количество, содержащее текст "inline" или "inlining".

1 голос
/ 30 июня 2010

@ грамм: есть довольно много сценариев, в которых inline не обязательно приносит вам пользу. Большинство компиляторов используют очень продвинутую эвристику, чтобы определить, когда нужно встроить. При обсуждении встраивания самая простая идея - довериться компилятору в создании самого быстрого кода.

0 голосов
/ 30 июня 2010

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

Тем не менее, прежде чем пытаться это сделать, вы, вероятно, должны пройти через параметры командной строки компиляторов.

0 голосов
/ 30 июня 2010

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

...