lamer0k 0 25 декабря, 2019 Опубликовано 25 декабря, 2019 · Жалоба Функции класса определенные сразу в объявления класса (в *.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") Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lamer0k 0 25 декабря, 2019 Опубликовано 25 декабря, 2019 · Жалоба Немного путано написал :) Попробую на примере, ниже функция 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") Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 26 декабря, 2019 Опубликовано 26 декабря, 2019 · Жалоба 8 hours ago, lamer0k said: В данном случае __forceinline это просто макрос для IAR Спасибо за развёрнутое объяснение! Возможно не разглядел этого в вашей статье на хабре) Пользуясь случаем хочу поблагодарить за все статьи, очень интересно написано! Кстати, а что с вашим предыдущим ником, вы же давно на электрониксе зарегистрированы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lamer0k 0 26 декабря, 2019 Опубликовано 26 декабря, 2019 · Жалоба 5 часов назад, haker_fox сказал: Пользуясь случаем хочу поблагодарить за все статьи, очень интересно написано Спасибо, хорошо, что это не зря и кому то это кажется полезным :) 5 часов назад, haker_fox сказал: Кстати, а что с вашим предыдущим ником Да, почту на которую был зарегистрирован уже заблокировали, а пароль не помню. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 26 декабря, 2019 Опубликовано 26 декабря, 2019 · Жалоба 11 minutes ago, lamer0k said: Спасибо, хорошо, что это не зря и кому то это кажется полезным :) Для меня очень даже полезным! 20 minutes ago, lamer0k said: Да, почту на которую был зарегистрирован уже заблокировали, а пароль не помню. О... А я вам на почту письмо писал((( А вы с текущим ником можете их получать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lamer0k 0 27 декабря, 2019 Опубликовано 27 декабря, 2019 · Жалоба В 26.12.2019 в 10:38, haker_fox сказал: А вы с текущим ником можете их получать? Отправил вам личное сообщение, чтобы в теме не мусорить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться