Перейти к содержанию
    

Инлайновая функция

Как кто? Вызов функции по указателю volatile. Он же не знает, что там в этом указателе (он же volatile!), поэтому именно вызовет функцию по указателю без всяких инлайнов. И заметьте, это чистый Си, без всяких прагм и атрибутов.

Да, в текущей версии IAR это работает, но нет уверенности, что будет также работать и в последующих.

В доках насчёт volatile говорится только применительно к данным, про код ничего не упоминается.

 

Немного погуглив нашёл _Pragma(...)

#ifdef IAR
        #define NO_OPT _Pragma ("optimize=none")
#endif

Ну так это совсем не то. Это как бороться с перхотью при помощи топора :biggrin:

Тогда уж так: #define NO_OPT _Pragma("inline=never")

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так это совсем не то.
То, то.

ИМХО внутри _Pragma(...) можно всё что угодно написать (даже "inline = forced") и задефайнить...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, в текущей версии IAR это работает, но нет уверенности, что будет также работать и в последующих.

В доках насчёт volatile говорится только применительно к данным, про код ничего не упоминается.

Это уже паранойа какая-то. Так можно в чём угодно усомниться :laughing:

Впрочем, я не настаиваю, куйте своё счастье самостоятельно :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это уже паранойа какая-то. Так можно в чём угодно усомниться :laughing:

Впрочем, я не настаиваю, куйте своё счастье самостоятельно :rolleyes:

В мануале на IAR нет ничего про volatile для указателей на функции. Судя по контексту описания, там везде подразумевается его использование для описания данных. Поэтому и осторожничаю.

Всё-таки про прагму чётко там написано: не будет инлайнится и всё тут.

А как поведёт себя в последующих версия IAR с void (* volatile)() - я не уверен.

Но всё равно - спасибо Вам что указали на такую возможность запрета inline. Мне самому не пришло в голову в своё время. :rolleyes:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отладить сложно неудобно в макросах, плюс проверка на соответствие типов в макросах отсутствует... ИМХО, не очень удобно. Хотя сам пользуюсь :biggrin:

Не только лишь все умеют иронию. :)

Да, в текущей версии IAR это работает, но нет уверенности, что будет также работать и в последующих.

В доках насчёт volatile говорится только применительно к данным, про код ничего не упоминается.

Ну так у компилятора нет гарантий что волотайл указывает на тот код который он думает, поэтому оптимизировать инлайном он не имеет права.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну так у компилятора нет гарантий что волотайл указывает на тот код который он думает, поэтому оптимизировать инлайном он не имеет права.

Вы полагаете, что способ предложенный scifi, не только сделает функцию явно не-инлайновой, но и запретит оптимизацию её кода? хмм.... если это так, то тогда этот способ некошерный...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вобщем вдруг осенило. вспомнил

#define Foo() do{ } while (0);

вот тебе бабушка и юрьев день инлайн

 

а впринципе я тут посчитал - что мы экономим на инлайне - 8-10 инструкций - 100-200 наносекунд - наверно это не существенно. разве это спасет отца русской демократии?

Изменено пользователем Jenya7

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы полагаете, что способ предложенный scifi, не только сделает функцию явно не-инлайновой, но и запретит оптимизацию её кода? хмм.... если это так, то тогда этот способ некошерный...

Почему оптимизацию-то запретит? Внутри всё заоптимизирует и снаружи тоже, а вот функцию как единицу вызова оставит. Единственное что вызывать её нужно всё таки по указателю, если быть педантичным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему оптимизацию-то запретит? Внутри всё заоптимизирует и снаружи тоже, а вот функцию как единицу вызова оставит.

И на каком основании Вы делаете такой вывод? Перечитал в мануале на IAR всё что касается volatile - там ни слова об указателях на функции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вобщем вдруг осенило. вспомнил
#define Foo() do{ } while (0);

вот тебе бабушка и юрьев день инлайн

 

а впринципе я тут посчитал - что мы экономим на инлайне - 8-10 инструкций - 100-200 наносекунд - наверно это не существенно. разве это спасет отца русской демократии?

Только без точки с запятой в конце.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сильно удивляете. Стандарт на язык читать надо, а не иаровский мануал.

Похоже на то, что стандарт не в курсе дела.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сильно удивляете. Стандарт на язык читать надо, а не иаровский мануал.

Можете привести выдержку из стандартна касательно этого?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можете привести выдержку из стандартна касательно этого?

Стандарт не обязан разжёвывать каждую ситуацию. Кое-что следует логически из того, что там написано.

У вас опасение, что при вызове функции по указателю компилятор заинлайнит код. Причина, по которой этого не случится: указатель объявлен как volatile, поэтому компилятор не знает, что в нём, поэтому не знает, какой код туда можно заинлайнить вместо вызова функции по указателю. Следовательно, вызовет функцию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кое-что следует логически из того, что там написано.

Из описание действия volatile на переменные, следует что компилятор не должен оптимизировать никакие операции с данными через эти указатели.

Соответственно - для указателей на функции можно ожидать, что он не будет оптимизировать и сами функции? Или даже - на всю цепочку функций, вызываемых из данной функции? А это меня не устраивает.

 

У вас опасение, что при вызове функции по указателю компилятор заинлайнит код.

Нет, скорее у меня опасение, что раз это явно не описано в стандарте, то может трактоваться строителями компиляторов так, как они считают правильным.

Это называется "undefined behaviour".

 

Причина, по которой этого не случится: указатель объявлен как volatile, поэтому компилятор не знает, что в нём, поэтому не знает, какой код туда можно заинлайнить вместо вызова функции по указателю. Следовательно, вызовет функцию.

Что значит "не знает"? Для функции есть объявление.

И если подходить логически, то что значит volatile для переменных? Он собственно означает, что порядок и количество операций доступа к данным при использовании volatile в оптимизированном коде должны быть точно такими же как в неоптимизированном. Раз в неоптимизированном коде сперва следует чтение указателя из памяти, значит компилятор при оптимизации не должен удалять такое чтение. Но вот что нельзя удалить пару инструкций BLX Rx/BX LR - это из описания volatile для данных никак не следует. Так как они не выполнят операций с памятью.

volatile накладывает ограничение на выполнение операций с объектом, а не на расположение объекта. Так что ничто не мешает ему расположить этот объект сразу после точки вызова, убрав инструкции передачи управления. Имхо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...