Перейти к содержанию
    

Особенности кодогенерации и оптимизации в Keil

Обнаружил сегодня, что в Кейле крайне нежелательно использовать функции std::min и std::max. Как и любые инлайн функции, которым передаётся ссылка на переменные интегрального типа.

Во-первых, если не включён режим оптимизации по времени, Кейл не инлайнит даже очень короткие функции, которые заинлайнить и короче и быстрее, чем выносить. По этой причине включение оптимизации по времени может давать и более короткий код :biggrin: .

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

крайне нежелательно использовать функции std::min и std::max.

Ну, это вы загнули. Не все постоянно куда-то опаздывают и считают наносекунды :biggrin:

И вообще, идеальных компиляторов не бывает. Поменьше заглядывайте в дизассемблер, и жизнь наладится :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, это вы загнули. Не все постоянно куда-то опаздывают и считают наносекунды :biggrin:

И вообще, идеальных компиляторов не бывает. Поменьше заглядывайте в дизассемблер, и жизнь наладится :biggrin:

Однако, я заметил, что мой МК непропорционально много времени проводит в одном часто вызываемом обработчике прерывания, несмотря на -O3 оптимизацию, заглянул в его листинг и... OMG! Пришлось сделать свой вариант min/max без ссылок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Быстрый обработчик прерывания на Си++? Боюсь, компиляторы до этого ещё не доросли. Собственно, топик именно об этом :laughing:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Быстрый обработчик прерывания на Си++? Боюсь, компиляторы до этого ещё не доросли. Собственно, топик именно об этом :laughing:

А почему бы и нет? В нём же не используются исключения и даже конструкторы. Других серьёзных претензий к кодогенерации нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Боюсь, компиляторы до этого ещё не доросли.
Ваши опасения напрасны.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Быстрый обработчик прерывания на Си++? Боюсь, компиляторы до этого ещё не доросли. Собственно, топик именно об этом :laughing:

Доросли. Вместе с Сишными где-то к концу 90x.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А с чего бы ему инлайнить если нет указаний инлайнить? Сделано это очевидно почему - для удобства отладки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А с чего бы ему инлайнить если нет указаний инлайнить? Сделано это очевидно почему - для удобства отладки.
Потому, что включён режим максимальной оптимизации - O3, функции std::min/std::max определены с inline, и компилятор должен бы видеть, что эти функции с подстановкой реализуются короче, чем с вызовом, не говоря о том, что быстрее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Напишите в форум ARM - пусть они точно ответят. Здесь никто не ответит за ARM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...