|
Инлайновая функция |
|
|
|
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 10 2018, 10:29
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
N3690 Цитата 146p 7.1.6.1 The cv-qualifiers 7 [ Note: volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation. Furthermore, for some implementations, volatile might indicate that special hardware instructions are required to access the object. See 1.9 for detailed semantics. In general, the semantics of volatile are intended to be the same in C++ as they are in C. — end note ]
8p 1.9 Program execution 8 The least requirements on a conforming implementation are: — Access to volatile objects are evaluated strictly according to the rules of the abstract machine Т.е. оно не заоптимизирует указатель даже если не видит переприсваиваний ему, а в нужном участке кода считает его значение и выполнит вызов функции по нему. Отчего у вас в голове родилась странная идея что внутри тела фукнции будет отключена оптимизация я не знаю. Она неверна. Цитата(aiwa @ Jul 10 2018, 10:11)  { ((void (* volatile)())func)(); // оптимизирует несмотря на volatile. наверное потому, что получаемый указатель rvalue; } Нет волатайл объекта - нет ограничений. Вот так уже работает.
|
|
|
|
|
Jul 10 2018, 11:32
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(Kabdim @ Jul 10 2018, 13:29)  Нет волатайл объекта - нет ограничений. Вот так уже работает. В одном случае работает, во втором не работает: Код void main() { fptr ftemp = (fptr)&func; (*ftemp)(); // работает. есть вызов. ((fptr)func)(); // не работает. происходит inline подстановка. тут rvalue }
|
|
|
|
|
Jul 10 2018, 13:49
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(aiwa @ Jul 10 2018, 14:32)  В одном случае работает, во втором не работает: Код void main() { fptr ftemp = (fptr)&func; (*ftemp)(); // работает. есть вызов. ((fptr)func)(); // не работает. происходит inline подстановка. тут rvalue } К чему вы это? Второй вариант снова попытка извернутся и не создавать указателя, которая закономерно заканчивается своершенно предсказуемым итогом. Если нужно гарантировать отсутствие инлайна никуда вы не отвертитись от указателя в памяти в явном виде.
|
|
|
|
|
Jul 10 2018, 14:36
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(Kabdim @ Jul 10 2018, 16:49)  К чему вы это? Второй вариант снова попытка извернутся и не создавать указателя, которая закономерно заканчивается своершенно предсказуемым итогом. Если нужно гарантировать отсутствие инлайна никуда вы не отвертитись от указателя в памяти в явном виде. К тому, что в Вашем конкретном примере наличие волатайл-указателя добавляет лишь заполнение его ячеек в стеке. Если его объявление заменить просто вызовом функции ничего не поменяется.
|
|
|
|
|
Jul 11 2018, 06:57
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(aiwa @ Jul 10 2018, 17:36)  Если его объявление заменить просто вызовом функции ничего не поменяется. Точнее - заменить команду BLX Rx. Чтение указателя из памяти должно остаться так как он volatile. А вот заменить BLX Rx на тело функции - это нисколько не противоречит концепции volatile, так как volatile (судя по её определению), должна сохранять неизменным только порядок доступов к памяти (чтений/записи). А не всю последовательность команд подряд. Но пара команд BLX Rx/BX LR - не осуществляет доступов к памяти. Так что - даже если современные версии компиляторов не инлайнят, то ничто не мешает инлайнить последующим версиям.
|
|
|
|
|
Jul 11 2018, 07:59
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(jcxz @ Jul 11 2018, 09:57)  так как volatile (судя по её определению), должна сохранять неизменным только порядок доступов к памяти (чтений/записи). Да, похоже что и даже это не так. Только что проверил: указание volatile даже не гарантирует сохранение порядка доступов к памяти. По крайней мере в IAR 7.80: Код static int DteTstInline1(char const *str, uint, uint) { return 0x3871; } static int DteTstInline0(char const *str, uint c, uint n) { static int (* volatile const pf)(char const *, uint, uint) = DteTstInline1; ... return (*pf)(str, c, __CLZ(n)); } Код ... LDR.W R3,??DataTable647_10 LDR R3,[R3, #+0] CLZ R2,R6 MOV R1,R5 MOV R0,R4 ADD SP,SP,#+4 POP {R4-R9,LR} BX R3
??DataTable647_10: DC32 `...::pf`
??_Z13DteTstInline1PKcjj: MOVW R0,#+14449 BX LR Как видно - компилятор разорвал выражение (*pf)(str, c, __CLZ(n)) и вставил между чтением volatile-константы и вызовом функции другой доступ к памяти: POP {R4-R9,LR}. Что странно, так как в пределах volatile он не должен вроде менять порядок доступов к памяти....
|
|
|
|
|
Jul 11 2018, 08:03
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(jcxz @ Jul 11 2018, 10:59)  Как видно - компилятор разорвал выражение (*pf)(str, c, __CLZ(n)) и вставил между чтением volatile-константы и вызовом функции другой доступ к памяти: POP {R4-R9,LR}. Что странно, так как в пределах volatile он не должен вроде менять порядок доступов к памяти....  Гарантируется порядок доступа к volatile-объектам. У вас в примере только один такой объект, поэтому говорить о порядке доступа не приходится. Вы откровенно плохо знаете стандарт. При этом риторика огого. Почаще туда заглядывайте.
|
|
|
|
Сообщений в этой теме
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 VladislavS Начиная с C++11 в каждой новой спецификации добавл... Jul 6 2018, 03:48 scifi Цитата(VladislavS @ Jul 6 2018, 06:48) Мо... Jul 6 2018, 06:53 jcxz Цитата(VladislavS @ Jul 6 2018, 06:48) По... Jul 6 2018, 07:27  scifi Цитата(jcxz @ Jul 6 2018, 10:27) Мне здес... Jul 6 2018, 07:36   jcxz Цитата(scifi @ Jul 6 2018, 10:36) Был слу... Jul 6 2018, 07:51    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    scifi Цитата(jcxz @ Jul 6 2018, 10:51) Но кто д... Jul 6 2018, 11:25     jcxz Цитата(scifi @ Jul 6 2018, 14:25) Как кто... Jul 6 2018, 11:44      demiurg_spb Цитата(jcxz @ Jul 6 2018, 14:44) Ну так э... Jul 6 2018, 11:47      scifi Цитата(jcxz @ Jul 6 2018, 14:44) Да, в те... Jul 6 2018, 12:54       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  scifi Цитата(aiwa @ Jul 10 2018, 14:32) В одном... Jul 10 2018, 11:51       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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|