реклама на сайте
подробности

 
 
> Инлайновая функция
Jenya7
сообщение Jul 5 2018, 08:57
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
VladislavS
сообщение Jul 6 2018, 03:48
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Начиная с C++11 в каждой новой спецификации добавляются всё новые возможности выполнения кода на этапе компиляции. Это сейчас модно, а не инлайны, с которыми компиляторы уже давным-давно научились сами разбираться. Попереключайте настройки оптимизатора и посмотрите результаты компиляции. Адептам секты пресвятого инлайна смотреть результат оптимизации с ключом Size на максимуме не рекомендую , чтобы при виде сплошного антиинлайна не возникли суицидалные мысли.

Сейчас мэинстрим чтобы программа вообще не порождала run-time кода sm.gif Модно написать программу на несколько страниц и получить пару ассемблерных команд. Даже соревнования проходят кто больше кода на этапе компиляции выполнит.

И тут очередной такой ТС с давно уже неактуальным инлайном на белом коне въезжает. Совет ТС - если у вас есть место где не проходите по скорости, а иначе зачем гнаться за инлайном, то лучше перепишите этот кусок более оптимально наблюдая за результатом компиляции. Может даже с уходом в ASM. Но надеяться на инлайн не стоит. Даже если вы директиву принудительного инлайна поставите, компилятор может её проигнорировать. Не из вредности, а из-за продвинутости оптимизатора.

Кстати, приёмов оптимизации в арсенале компилятора очень много, но почему-то только инлайн так волнует души неокрепших программистов sm.gif Почему вас раскручивание циклов вообще не волнует, а? wink.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 07:27
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(VladislavS @ Jul 6 2018, 06:48) *
Почему вас раскручивание циклов вообще не волнует, а? wink.gif

Это точно sm.gif
Мне здесь на форуме один товарищ недавно рассказывал и пытался убеждать, что копирование через memcpy() в любом случае быстрее, чем написать это копирование простым циклом на си. Сколько я ему не намекал, что оптимизирующий компилятор может и этот цикл и даже саму memcpy(!) раскрутить в несколько ассемблерных инструкций (в зависимости от размера пересылки, выравниваний и известности параметров пересылки на этапе компиляции), а может и то и другое заменить просто оптимальным циклом с копированием внутри - так и не убедил его. Он только обиделся. Он приводил в доказательство какие-то частные случаи, в определённых созданных им условиях.
Так он и не понял, что при включении максимальной оптимизации и чем лучше и продвинутее компилятор, тем результат будет больше зависеть от реализуемого действия (алгоритма), а не от способа его реализации (цикл-ли, инлайн или даже memcpy).
Так и ТС здесь - уверен что что-то зависит от того, с inline он напишет функцию или без. wink.gif
Так что как я неоднократно убеждался - понимание принципов работы оптимизаторов ускользает от основной массы программистов, сколько не описывай это в мануалах. Ну и в результирующий ассемблерный код тоже как видно мало кто смотрит и понимает его. Иначе бы даже без мануалов всё было понятно.

PS: Кстати - вдогонку, в тему: Иногда возникает желание сказать компилятору (IAR в частности), чтобы он не inline-ил функцию. Так это сделать посложнее чем сказать inline.
А вот сделать функцию жёстко "не inline" вне зависимости от работы оптимизатора - это имхо гораздо полезнее чем сделать её inline.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 6 2018, 07:36
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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, не? И вызывать через этот указатель для верности.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 07:51
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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. Но это компиляторо-зависимо.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 6 2018, 11:25
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Jul 6 2018, 10:51) *
Но кто дальше ему мешает просто вставить код функции?

Как кто? Вызов функции по указателю volatile. Он же не знает, что там в этом указателе (он же volatile!), поэтому именно вызовет функцию по указателю без всяких инлайнов. И заметьте, это чистый Си, без всяких прагм и атрибутов.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 11:44
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 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

Ну так это совсем не то. Это как бороться с перхотью при помощи топора biggrin.gif
Тогда уж так: #define NO_OPT _Pragma("inline=never")
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 6 2018, 12:54
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Jul 6 2018, 14:44) *
Да, в текущей версии IAR это работает, но нет уверенности, что будет также работать и в последующих.
В доках насчёт volatile говорится только применительно к данным, про код ничего не упоминается.

Это уже паранойа какая-то. Так можно в чём угодно усомниться laughing.gif
Впрочем, я не настаиваю, куйте своё счастье самостоятельно rolleyes.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01497 секунд с 7
ELECTRONIX ©2004-2016