|
Инлайновая функция |
|
|
|
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
|
|
|
|
|
 |
Ответов
(45 - 59)
|
Jul 10 2018, 07:10
|
Местный
  
Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140

|
Цитата(jcxz @ Jul 10 2018, 09:45)  Соответственно - для указателей на функции можно ожидать, что он не будет оптимизировать и сами функции? Не совсем понятно почему такое может быть. Функция на момент компиляции ничего не знает о существовании указателей на неё. Она даже где-то в другом модуле может быть скомпилирована и лежит себе ждёт своего часа. Остаётся взять её адрес и вызвать пока тёпленькая.
|
|
|
|
|
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)  К чему вы это? Второй вариант снова попытка извернутся и не создавать указателя, которая закономерно заканчивается своершенно предсказуемым итогом. Если нужно гарантировать отсутствие инлайна никуда вы не отвертитись от указателя в памяти в явном виде. К тому, что в Вашем конкретном примере наличие волатайл-указателя добавляет лишь заполнение его ячеек в стеке. Если его объявление заменить просто вызовом функции ничего не поменяется.
|
|
|
|
|
  |
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|