встройте функцию в другой подставляемой функции в C

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

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

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

6
задан gramm 30 June 2010 в 09:44
поделиться

5 ответов

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

8
ответ дан 8 December 2019 в 14:40
поделиться

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

1
ответ дан 8 December 2019 в 14:40
поделиться

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

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

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

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

Кроме того, проверьте это , чтобы узнать, какие оптимизации есть в gcc, в том числе многие из них содержат текст «inline» или «inlining».

8
ответ дан 8 December 2019 в 14:40
поделиться

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

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

0
ответ дан 8 December 2019 в 14:40
поделиться

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

-1
ответ дан 8 December 2019 в 14:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: