jcxz 241 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Как кто? Вызов функции по указателю volatile. Он же не знает, что там в этом указателе (он же volatile!), поэтому именно вызовет функцию по указателю без всяких инлайнов. И заметьте, это чистый Си, без всяких прагм и атрибутов. Да, в текущей версии IAR это работает, но нет уверенности, что будет также работать и в последующих. В доках насчёт volatile говорится только применительно к данным, про код ничего не упоминается. Немного погуглив нашёл _Pragma(...) #ifdef IAR #define NO_OPT _Pragma ("optimize=none") #endif Ну так это совсем не то. Это как бороться с перхотью при помощи топора :biggrin: Тогда уж так: #define NO_OPT _Pragma("inline=never") Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Ну так это совсем не то.То, то. ИМХО внутри _Pragma(...) можно всё что угодно написать (даже "inline = forced") и задефайнить... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Да, в текущей версии IAR это работает, но нет уверенности, что будет также работать и в последующих. В доках насчёт volatile говорится только применительно к данным, про код ничего не упоминается. Это уже паранойа какая-то. Так можно в чём угодно усомниться :laughing: Впрочем, я не настаиваю, куйте своё счастье самостоятельно :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Это уже паранойа какая-то. Так можно в чём угодно усомниться :laughing: Впрочем, я не настаиваю, куйте своё счастье самостоятельно :rolleyes: В мануале на IAR нет ничего про volatile для указателей на функции. Судя по контексту описания, там везде подразумевается его использование для описания данных. Поэтому и осторожничаю. Всё-таки про прагму чётко там написано: не будет инлайнится и всё тут. А как поведёт себя в последующих версия IAR с void (* volatile)() - я не уверен. Но всё равно - спасибо Вам что указали на такую возможность запрета inline. Мне самому не пришло в голову в своё время. :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Отладить сложно неудобно в макросах, плюс проверка на соответствие типов в макросах отсутствует... ИМХО, не очень удобно. Хотя сам пользуюсь :biggrin: Не только лишь все умеют иронию. :) Да, в текущей версии IAR это работает, но нет уверенности, что будет также работать и в последующих. В доках насчёт volatile говорится только применительно к данным, про код ничего не упоминается. Ну так у компилятора нет гарантий что волотайл указывает на тот код который он думает, поэтому оптимизировать инлайном он не имеет права. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Ну так у компилятора нет гарантий что волотайл указывает на тот код который он думает, поэтому оптимизировать инлайном он не имеет права. Вы полагаете, что способ предложенный scifi, не только сделает функцию явно не-инлайновой, но и запретит оптимизацию её кода? хмм.... если это так, то тогда этот способ некошерный... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 7 июля, 2018 Опубликовано 7 июля, 2018 (изменено) · Жалоба вобщем вдруг осенило. вспомнил #define Foo() do{ } while (0); вот тебе бабушка и юрьев день инлайн а впринципе я тут посчитал - что мы экономим на инлайне - 8-10 инструкций - 100-200 наносекунд - наверно это не существенно. разве это спасет отца русской демократии? Изменено 7 июля, 2018 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Вы полагаете, что способ предложенный scifi, не только сделает функцию явно не-инлайновой, но и запретит оптимизацию её кода? хмм.... если это так, то тогда этот способ некошерный... Почему оптимизацию-то запретит? Внутри всё заоптимизирует и снаружи тоже, а вот функцию как единицу вызова оставит. Единственное что вызывать её нужно всё таки по указателю, если быть педантичным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 8 июля, 2018 Опубликовано 8 июля, 2018 · Жалоба Почему оптимизацию-то запретит? Внутри всё заоптимизирует и снаружи тоже, а вот функцию как единицу вызова оставит. И на каком основании Вы делаете такой вывод? Перечитал в мануале на IAR всё что касается volatile - там ни слова об указателях на функции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Сильно удивляете. Стандарт на язык читать надо, а не иаровский мануал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 183 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба вобщем вдруг осенило. вспомнил#define Foo() do{ } while (0); вот тебе бабушка и юрьев день инлайн а впринципе я тут посчитал - что мы экономим на инлайне - 8-10 инструкций - 100-200 наносекунд - наверно это не существенно. разве это спасет отца русской демократии? Только без точки с запятой в конце. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 9 июля, 2018 Опубликовано 9 июля, 2018 · Жалоба Сильно удивляете. Стандарт на язык читать надо, а не иаровский мануал. Похоже на то, что стандарт не в курсе дела. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Сильно удивляете. Стандарт на язык читать надо, а не иаровский мануал. Можете привести выдержку из стандартна касательно этого? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Можете привести выдержку из стандартна касательно этого? Стандарт не обязан разжёвывать каждую ситуацию. Кое-что следует логически из того, что там написано. У вас опасение, что при вызове функции по указателю компилятор заинлайнит код. Причина, по которой этого не случится: указатель объявлен как volatile, поэтому компилятор не знает, что в нём, поэтому не знает, какой код туда можно заинлайнить вместо вызова функции по указателю. Следовательно, вызовет функцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Кое-что следует логически из того, что там написано. Из описание действия volatile на переменные, следует что компилятор не должен оптимизировать никакие операции с данными через эти указатели. Соответственно - для указателей на функции можно ожидать, что он не будет оптимизировать и сами функции? Или даже - на всю цепочку функций, вызываемых из данной функции? А это меня не устраивает. У вас опасение, что при вызове функции по указателю компилятор заинлайнит код. Нет, скорее у меня опасение, что раз это явно не описано в стандарте, то может трактоваться строителями компиляторов так, как они считают правильным. Это называется "undefined behaviour". Причина, по которой этого не случится: указатель объявлен как volatile, поэтому компилятор не знает, что в нём, поэтому не знает, какой код туда можно заинлайнить вместо вызова функции по указателю. Следовательно, вызовет функцию. Что значит "не знает"? Для функции есть объявление. И если подходить логически, то что значит volatile для переменных? Он собственно означает, что порядок и количество операций доступа к данным при использовании volatile в оптимизированном коде должны быть точно такими же как в неоптимизированном. Раз в неоптимизированном коде сперва следует чтение указателя из памяти, значит компилятор при оптимизации не должен удалять такое чтение. Но вот что нельзя удалить пару инструкций BLX Rx/BX LR - это из описания volatile для данных никак не следует. Так как они не выполнят операций с памятью. volatile накладывает ограничение на выполнение операций с объектом, а не на расположение объекта. Так что ничто не мешает ему расположить этот объект сразу после точки вызова, убрав инструкции передачи управления. Имхо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться