|
Инлайновая функция |
|
|
|
Jul 5 2018, 08:57
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Если я определяю функцию как инлайн Код файл .h inline uint32_t SYSTIME_GetSystemTime(void); файл .с inline uint32_t SYSTIME_GetSystemTime(void) { //do something } то при вызове функции IAR ругается Error[Li005]: no definition for "SYSTIME_GetSystemTime" то есть функцию надо разместить в .h файле по другому никак?
Сообщение отредактировал Jenya7 - Jul 5 2018, 10:37
|
|
|
|
|
 |
Ответов
|
Jul 6 2018, 03:48
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Начиная с C++11 в каждой новой спецификации добавляются всё новые возможности выполнения кода на этапе компиляции. Это сейчас модно, а не инлайны, с которыми компиляторы уже давным-давно научились сами разбираться. Попереключайте настройки оптимизатора и посмотрите результаты компиляции. Адептам секты пресвятого инлайна смотреть результат оптимизации с ключом Size на максимуме не рекомендую , чтобы при виде сплошного антиинлайна не возникли суицидалные мысли. Сейчас мэинстрим чтобы программа вообще не порождала run-time кода  Модно написать программу на несколько страниц и получить пару ассемблерных команд. Даже соревнования проходят кто больше кода на этапе компиляции выполнит. И тут очередной такой ТС с давно уже неактуальным инлайном на белом коне въезжает. Совет ТС - если у вас есть место где не проходите по скорости, а иначе зачем гнаться за инлайном, то лучше перепишите этот кусок более оптимально наблюдая за результатом компиляции. Может даже с уходом в ASM. Но надеяться на инлайн не стоит. Даже если вы директиву принудительного инлайна поставите, компилятор может её проигнорировать. Не из вредности, а из-за продвинутости оптимизатора. Кстати, приёмов оптимизации в арсенале компилятора очень много, но почему-то только инлайн так волнует души неокрепших программистов  Почему вас раскручивание циклов вообще не волнует, а?
|
|
|
|
|
Jul 6 2018, 07:27
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(VladislavS @ Jul 6 2018, 06:48)  Почему вас раскручивание циклов вообще не волнует, а?  Это точно  Мне здесь на форуме один товарищ недавно рассказывал и пытался убеждать, что копирование через memcpy() в любом случае быстрее, чем написать это копирование простым циклом на си. Сколько я ему не намекал, что оптимизирующий компилятор может и этот цикл и даже саму memcpy(!) раскрутить в несколько ассемблерных инструкций (в зависимости от размера пересылки, выравниваний и известности параметров пересылки на этапе компиляции), а может и то и другое заменить просто оптимальным циклом с копированием внутри - так и не убедил его. Он только обиделся. Он приводил в доказательство какие-то частные случаи, в определённых созданных им условиях. Так он и не понял, что при включении максимальной оптимизации и чем лучше и продвинутее компилятор, тем результат будет больше зависеть от реализуемого действия (алгоритма), а не от способа его реализации (цикл-ли, инлайн или даже memcpy). Так и ТС здесь - уверен что что-то зависит от того, с inline он напишет функцию или без. Так что как я неоднократно убеждался - понимание принципов работы оптимизаторов ускользает от основной массы программистов, сколько не описывай это в мануалах. Ну и в результирующий ассемблерный код тоже как видно мало кто смотрит и понимает его. Иначе бы даже без мануалов всё было понятно. PS: Кстати - вдогонку, в тему: Иногда возникает желание сказать компилятору (IAR в частности), чтобы он не inline-ил функцию. Так это сделать посложнее чем сказать inline. А вот сделать функцию жёстко "не inline" вне зависимости от работы оптимизатора - это имхо гораздо полезнее чем сделать её inline.
|
|
|
|
|
Jul 6 2018, 07:36
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(jcxz @ Jul 6 2018, 10:27)  Мне здесь на форуме один товарищ недавно рассказывал и пытался убеждать, что копирование через memcpy() в любом случае быстрее, чем написать это копирование простым циклом на си. Сколько я ему не намекал, что оптимизирующий компилятор может и этот цикл и даже саму memcpy(!) раскрутить в несколько ассемблерных инструкций (в зависимости от размера пересылки, выравниваний и известности параметров пересылки на этапе компиляции), а может и то и другое заменить просто оптимальным циклом с копированием внутри - так и не убедил его. Он только обиделся. Он приводил в доказательство какие-то частные случаи, в определённых созданных им условиях. Был случай, когда хотелось, чтобы memcpy был маленький и медленный. Скорость не нужна, а байтов жалко. Библиотечный memcpy шибко умный, видимо. Ускоренный настолько, что весит сотни байт :-( Хоть заменяй своим. Цитата(jcxz @ Jul 6 2018, 10:27)  PS: Кстати - вдогонку, в тему: Иногда возникает желание сказать компилятору (IAR в частности), чтобы он не inline-ил функцию. Так это сделать посложнее чем сказать inline. А вот сделать функцию жёстко "не inline" вне зависимости от работы оптимизатора - это имхо гораздо полезнее чем сделать её inline. Очевидно же: взять адрес функции, загнать его в указатель volatile, не? И вызывать через этот указатель для верности.
|
|
|
|
|
Jul 6 2018, 07:51
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ Jul 6 2018, 10:36)  Был случай, когда хотелось, чтобы memcpy был маленький и медленный. Скорость не нужна, а байтов жалко. Библиотечный memcpy шибко умный, видимо. Ускоренный настолько, что весит сотни байт :-( Хоть заменяй своим. Когда хочется иметь определённый ассемблерный результат, вне зависимости от умности компилятора, то есть только один надёжный выход - ассемблер. И не нужно его бояться. Цитата(scifi @ Jul 6 2018, 10:36)  Очевидно же: взять адрес функции, загнать его в указатель volatile, не? И вызывать через этот указатель для верности. Не уверен что это прокатит с любым компилятором. Да, указатель он создаст, и пожалуй даже поставит команду LDR Rx, указатель. Но кто дальше ему мешает просто вставить код функции? Ведь все условия volatile указателя он уже выполнил: создал его, и чтение его выполнил. PS: Про #pragma inline=never знаю и его сейчас и использую в IAR. Но это компиляторо-зависимо.
|
|
|
|
|
Jul 6 2018, 11:44
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(scifi @ Jul 6 2018, 14:25)  Как кто? Вызов функции по указателю volatile. Он же не знает, что там в этом указателе (он же volatile!), поэтому именно вызовет функцию по указателю без всяких инлайнов. И заметьте, это чистый Си, без всяких прагм и атрибутов. Да, в текущей версии IAR это работает, но нет уверенности, что будет также работать и в последующих. В доках насчёт volatile говорится только применительно к данным, про код ничего не упоминается. Цитата(demiurg_spb @ Jul 6 2018, 14:30)  Немного погуглив нашёл _Pragma(...)Код #ifdef IAR #define NO_OPT _Pragma ("optimize=none") #endif Ну так это совсем не то. Это как бороться с перхотью при помощи топора  Тогда уж так: #define NO_OPT _Pragma("inline=never")
|
|
|
|
Сообщений в этой теме
Jenya7 Инлайновая функция Jul 5 2018, 08:57 aaarrr Цитата(Jenya7 @ Jul 5 2018, 11:57) то ест... Jul 5 2018, 09:13 scifi Зачем вам этот инлайн? Включайте в яре "multi... Jul 5 2018, 09:16 Jenya7 Цитата(scifi @ Jul 5 2018, 14:16) Зачем в... Jul 5 2018, 10:37  scifi Цитата(Jenya7 @ Jul 5 2018, 13:37) так он... Jul 5 2018, 10:49   Jenya7 Цитата(scifi @ Jul 5 2018, 15:49) Ну это ... Jul 5 2018, 11:09    Arlleex Цитата(Jenya7 @ Jul 5 2018, 15:09) если в... Jul 5 2018, 11:13    jcxz Цитата(Jenya7 @ Jul 5 2018, 14:09) если в... Jul 5 2018, 11:15 VladislavS Свидетели секты пресвятого инлайна. Jul 5 2018, 11:05 VladislavS Среди программистов ходит байка, что некоторые ком... Jul 5 2018, 11:31 scifi Цитата(VladislavS @ Jul 5 2018, 14:31) Гд... Jul 5 2018, 11:42 demiurg_spb Кодфайл .h
static inline uint32_t SYSTIME_GetSyste... Jul 5 2018, 13:20 Kabdim Четкие пацаны, которым нужен четкий инлайн пишут н... Jul 5 2018, 13:25 jcxz Цитата(Kabdim @ Jul 5 2018, 16:25) Четкие... Jul 5 2018, 14:38 Arlleex Цитата(Kabdim @ Jul 5 2018, 17:25) Четкие... Jul 5 2018, 14:53  Kabdim Цитата(Arlleex @ Jul 5 2018, 17:53) Отлад... Jul 6 2018, 15:36   jcxz Цитата(Kabdim @ Jul 6 2018, 18:36) Ну так... Jul 6 2018, 16:32    Kabdim Цитата(jcxz @ Jul 6 2018, 19:32) Вы полаг... Jul 8 2018, 15:52     jcxz Цитата(Kabdim @ Jul 8 2018, 18:52) Почему... Jul 8 2018, 23:47 scifi Цитата(Kabdim @ Jul 5 2018, 16:25) Четкие... Jul 5 2018, 14:59  esaulenka Цитата(scifi @ Jul 5 2018, 17:59) инлайн ... Jul 5 2018, 19:49   Сергей Борщ QUOTE (esaulenka @ Jul 5 2018, 22:49) Мож... Jul 5 2018, 23:19  jcxz Цитата(scifi @ Jul 5 2018, 17:59) Но дело... Jul 5 2018, 20:07 technik-1017 inline нужен, например, для функций в прерываниях,... Jul 5 2018, 15:19 scifi Цитата(VladislavS @ Jul 6 2018, 06:48) Мо... Jul 6 2018, 06:53    demiurg_spb Цитата(jcxz @ Jul 6 2018, 10:51) А в IAR ... Jul 6 2018, 11:13     jcxz Цитата(demiurg_spb @ Jul 6 2018, 14:13) А... Jul 6 2018, 11:23      VladislavS Цитата(jcxz @ Jul 6 2018, 14:23) Но я не ... Jul 6 2018, 11:26       demiurg_spb Немного погуглив нашёл _Pragma(...)
Код#ifdef IAR
... Jul 6 2018, 11:30      demiurg_spb Цитата(jcxz @ Jul 6 2018, 14:44) Ну так э... Jul 6 2018, 11:47       jcxz Цитата(scifi @ Jul 6 2018, 15:54) Это уже... Jul 6 2018, 15:24 Jenya7 вобщем вдруг осенило. вспомнилКод#define Foo(... Jul 7 2018, 05:45 Arlleex Цитата(Jenya7 @ Jul 7 2018, 08:45) вобщем... Jul 9 2018, 18:49 Kabdim Сильно удивляете. Стандарт на язык читать надо, а ... Jul 9 2018, 01:10 aiwa Цитата(Kabdim @ Jul 9 2018, 04:10) Сильно... Jul 9 2018, 20:12 jcxz Цитата(Kabdim @ Jul 9 2018, 04:10) Сильно... Jul 10 2018, 06:17  scifi Цитата(jcxz @ Jul 10 2018, 09:17) Можете ... Jul 10 2018, 06:23   jcxz Цитата(scifi @ Jul 10 2018, 09:23) Кое-чт... Jul 10 2018, 06:45    VladislavS Цитата(jcxz @ Jul 10 2018, 09:45) Соответ... Jul 10 2018, 07:10 aiwa Имхо, в случае с указателем на функцию играет роль... Jul 10 2018, 06:55 scifi Я устал объяснять. Просто скажу, что вы заблуждает... Jul 10 2018, 06:55 aiwa {
((void (* volatile)())func)(); // оптимизирует ... Jul 10 2018, 07:11 Kabdim N3690
Цитата146p 7.1.6.1 The cv-qualifiers
7 [ Not... Jul 10 2018, 10:29 aiwa Цитата(Kabdim @ Jul 10 2018, 13:29) Нет в... Jul 10 2018, 11:32  scifi Цитата(aiwa @ Jul 10 2018, 14:32) В одном... Jul 10 2018, 11:51  Kabdim Цитата(aiwa @ Jul 10 2018, 14:32) В одном... Jul 10 2018, 13:49   aiwa Цитата(Kabdim @ Jul 10 2018, 16:49) К чем... Jul 10 2018, 14:36    jcxz Цитата(aiwa @ Jul 10 2018, 17:36) Если ег... Jul 11 2018, 06:57     jcxz Цитата(jcxz @ Jul 11 2018, 09:57) так как... Jul 11 2018, 07:59      scifi Цитата(jcxz @ Jul 11 2018, 10:59) Как вид... Jul 11 2018, 08:03       jcxz Цитата(scifi @ Jul 11 2018, 11:03) Гарант... Jul 11 2018, 08:08        scifi Цитата(jcxz @ Jul 11 2018, 11:08) Ладно -... Jul 11 2018, 08:11         jcxz Цитата(scifi @ Jul 11 2018, 11:11) И это ... Jul 11 2018, 08:12          scifi Цитата(jcxz @ Jul 11 2018, 11:12) Ну-ну..... Jul 11 2018, 08:13     aiwa Цитата(jcxz @ Jul 11 2018, 09:57) Так что... Jul 11 2018, 10:01      scifi Цитата(aiwa @ Jul 11 2018, 13:01) Стандар... Jul 11 2018, 10:03      Kabdim Цитата(aiwa @ Jul 11 2018, 13:01) Стандар... Jul 11 2018, 10:24       scifi Цитата(Kabdim @ Jul 11 2018, 13:24) преду... Jul 11 2018, 10:28        Kabdim Цитата(scifi @ Jul 11 2018, 13:28) Значит... Jul 11 2018, 10:34 VladislavS Господа, вы научно-технические извращенцы Скомпил... Jul 10 2018, 11:41 jcxz Цитата(VladislavS @ Jul 10 2018, 14:41) С... Jul 10 2018, 11:56 VladislavS Блин, секта отрицателей инлайна, оказывается, ещё ... Jul 10 2018, 12:01 demiurg_spb Тут ещё extern inline не обсосали)))
Помню что в ... Jul 10 2018, 12:26 aiwa Цитата(VladislavS @ Jul 10 2018, 15:01) Б... Jul 10 2018, 13:41 VladislavS Придумал. Если функцию разместить в другой секции,... Jul 10 2018, 14:33 Kabdim Почему ничего не меняется? По-моему меняется инлай... Jul 10 2018, 15:26 aiwa Цитата(Kabdim @ Jul 10 2018, 18:26) УПД2:... Jul 11 2018, 05:55 jcxz Цитата(Kabdim @ Jul 10 2018, 18:26) попро... Jul 11 2018, 07:10  scifi Цитата(jcxz @ Jul 11 2018, 10:10) А я при... Jul 11 2018, 07:23  Kabdim Цитата(jcxz @ Jul 11 2018, 10:10) Где??? ... Jul 11 2018, 09:06 scifi Цитата(jcxz @ Jul 11 2018, 09:57) ничто н... Jul 11 2018, 07:04 jcxz Цитата(scifi @ Jul 11 2018, 10:04) Возраж... Jul 11 2018, 07:40  scifi Код уже приводили:
Кодvoid f(void)
{
do_... Jul 11 2018, 07:45 aiwa Насколько я понимаю, под реализацией имеется ввиду... Jul 11 2018, 10:17 scifi Цитата(aiwa @ Jul 11 2018, 13:17) Однако ... Jul 11 2018, 10:20  aiwa Цитата(scifi @ Jul 11 2018, 13:20) Станда... Jul 11 2018, 10:30   scifi Цитата(aiwa @ Jul 11 2018, 13:30) В англи... Jul 11 2018, 10:35  aiwa Цитата(scifi @ Jul 11 2018, 13:20) Нет, н... Jul 12 2018, 10:01 Kabdim Кстати с волатайл буферами (если не хочется быть п... Jul 11 2018, 10:50
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|