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

IAR 8.40.1, директива __forceinline

Функции класса определенные сразу в объявления класса (в *.h) являются inline по определению, те которые определены в *.cpp таковыми не являются и компилятор может их сам заинлайнить при оптимизации.

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

Specifying #pragma inline=forced will always inline the defined function. If the compiler fails to inline the function for some reason, for example due to recursion, a warning message is emitted. Inlining is normally performed only on the High optimization level. Specifying #pragma inline=forced will inline the function or result in an error due to recursion etc.
 

В данном случае __forceinline это просто макрос для IAR, который применяется для inline функций (определенных в заголовочниках сразу при объявлении)

#define __forceinline  _Pragma("inline=forced")

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


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

Немного путано написал :)

Попробую на примере, ниже функция Set является inline по определению (определение функции сразу в месте её объявления). Но без оптимизации компилятор её такой делать не будет, потому что отлаживать будет невозможно и он сделает обычный вызов. Если же вы все таки хотите, чтобы функция инлайнилась даже без оптимизации, то нужно об этом сказать компилятору, мол сделай её инлайн принудительно. В таком случае, без оптимизации она тоже станет инлайн:

 

template <typename T>
struct Port
{
  __forceinline void Set(std::uint32_t value)
  {
    assert((value <= (1 << 16U))) ;
    T::BSRR::Write(static_cast<typename T::BSRR::Type>(value)) ;
  }
}

Если же вы сделаете так как ниже, то функция Set уже не inline (так определение функции вынесено из объявления класса), и тогда даже если принудительно скажете компилятору сделай её инлайн, он может этого и не сделать без включенной оптимизации, но постарается сделать это при оптимизации и если сможет - сделает.

struct Port
{
  void Set(std::uint32_t value) ;
} ;
__forceinline void Port::Set(std::uint32_t value)
{
  assert((value <= (1 << 16U))) ;
  T::BSRR::Write(static_cast<typename T::BSRR::Type>(value)) ;
}

Сам __forceinline это просто макрос

#define __forceinline _Pragma("inline=forced")

 

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


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

8 hours ago, lamer0k said:

В данном случае __forceinline это просто макрос для IAR

Спасибо за развёрнутое объяснение! Возможно не разглядел этого в вашей статье на хабре) Пользуясь случаем хочу поблагодарить за все статьи, очень интересно написано! Кстати, а что с вашим предыдущим ником, вы же давно на электрониксе зарегистрированы?

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


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

5 часов назад, haker_fox сказал:

Пользуясь случаем хочу поблагодарить за все статьи, очень интересно написано

Спасибо, хорошо, что это не зря и кому то это кажется полезным :)

5 часов назад, haker_fox сказал:

Кстати, а что с вашим предыдущим ником

Да, почту на которую был зарегистрирован уже заблокировали, а пароль не помню. 

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


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

11 minutes ago, lamer0k said:

Спасибо, хорошо, что это не зря и кому то это кажется полезным :)

Для меня очень даже полезным!

20 minutes ago, lamer0k said:

Да, почту на которую был зарегистрирован уже заблокировали, а пароль не помню.

О... А я вам на почту письмо писал((( А вы с текущим ником можете их получать?

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


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

В 26.12.2019 в 10:38, haker_fox сказал:

А вы с текущим ником можете их получать?

Отправил вам личное сообщение, чтобы в теме не мусорить.

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


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

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

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

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

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

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

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

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

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

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