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

 
 
6 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Инлайновая функция
jcxz
сообщение Jul 6 2018, 11:44
Сообщение #31


Гуру
******

Группа: Свой
Сообщений: 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
demiurg_spb
сообщение Jul 6 2018, 11:47
Сообщение #32


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(jcxz @ Jul 6 2018, 14:44) *
Ну так это совсем не то.
То, то.
ИМХО внутри _Pragma(...) можно всё что угодно написать (даже "inline = forced") и задефайнить...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 6 2018, 12:54
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 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
jcxz
сообщение Jul 6 2018, 15:24
Сообщение #34


Гуру
******

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



Цитата(scifi @ Jul 6 2018, 15:54) *
Это уже паранойа какая-то. Так можно в чём угодно усомниться laughing.gif
Впрочем, я не настаиваю, куйте своё счастье самостоятельно rolleyes.gif

В мануале на IAR нет ничего про volatile для указателей на функции. Судя по контексту описания, там везде подразумевается его использование для описания данных. Поэтому и осторожничаю.
Всё-таки про прагму чётко там написано: не будет инлайнится и всё тут.
А как поведёт себя в последующих версия IAR с void (* volatile)() - я не уверен.
Но всё равно - спасибо Вам что указали на такую возможность запрета inline. Мне самому не пришло в голову в своё время. rolleyes.gif
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 6 2018, 15:36
Сообщение #35


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(Arlleex @ Jul 5 2018, 17:53) *
Отладить сложно неудобно в макросах, плюс проверка на соответствие типов в макросах отсутствует... ИМХО, не очень удобно. Хотя сам пользуюсь biggrin.gif

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

Ну так у компилятора нет гарантий что волотайл указывает на тот код который он думает, поэтому оптимизировать инлайном он не имеет права.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 6 2018, 16:32
Сообщение #36


Гуру
******

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



Цитата(Kabdim @ Jul 6 2018, 18:36) *
Ну так у компилятора нет гарантий что волотайл указывает на тот код который он думает, поэтому оптимизировать инлайном он не имеет права.

Вы полагаете, что способ предложенный scifi, не только сделает функцию явно не-инлайновой, но и запретит оптимизацию её кода? хмм.... если это так, то тогда этот способ некошерный...
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Jul 7 2018, 05:45
Сообщение #37


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

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



вобщем вдруг осенило. вспомнил
Код
#define Foo() do{ } while (0);
вот тебе бабушка и юрьев день инлайн

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

Сообщение отредактировал Jenya7 - Jul 7 2018, 05:52
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 8 2018, 15:52
Сообщение #38


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(jcxz @ Jul 6 2018, 19:32) *
Вы полагаете, что способ предложенный scifi, не только сделает функцию явно не-инлайновой, но и запретит оптимизацию её кода? хмм.... если это так, то тогда этот способ некошерный...

Почему оптимизацию-то запретит? Внутри всё заоптимизирует и снаружи тоже, а вот функцию как единицу вызова оставит. Единственное что вызывать её нужно всё таки по указателю, если быть педантичным.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 8 2018, 23:47
Сообщение #39


Гуру
******

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



Цитата(Kabdim @ Jul 8 2018, 18:52) *
Почему оптимизацию-то запретит? Внутри всё заоптимизирует и снаружи тоже, а вот функцию как единицу вызова оставит.

И на каком основании Вы делаете такой вывод? Перечитал в мануале на IAR всё что касается volatile - там ни слова об указателях на функции.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 9 2018, 01:10
Сообщение #40


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Сильно удивляете. Стандарт на язык читать надо, а не иаровский мануал.
Go to the top of the page
 
+Quote Post
Arlleex
сообщение Jul 9 2018, 18:49
Сообщение #41


Местный
***

Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264



Цитата(Jenya7 @ Jul 7 2018, 08:45) *
вобщем вдруг осенило. вспомнил
Код
#define Foo() do{ } while (0);
вот тебе бабушка и юрьев день инлайн

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

Только без точки с запятой в конце.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jul 9 2018, 20:12
Сообщение #42


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(Kabdim @ Jul 9 2018, 04:10) *
Сильно удивляете. Стандарт на язык читать надо, а не иаровский мануал.

Похоже на то, что стандарт не в курсе дела.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 10 2018, 06:17
Сообщение #43


Гуру
******

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



Цитата(Kabdim @ Jul 9 2018, 04:10) *
Сильно удивляете. Стандарт на язык читать надо, а не иаровский мануал.

Можете привести выдержку из стандартна касательно этого?
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 10 2018, 06:23
Сообщение #44


Гуру
******

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



Цитата(jcxz @ Jul 10 2018, 09:17) *
Можете привести выдержку из стандартна касательно этого?

Стандарт не обязан разжёвывать каждую ситуацию. Кое-что следует логически из того, что там написано.
У вас опасение, что при вызове функции по указателю компилятор заинлайнит код. Причина, по которой этого не случится: указатель объявлен как volatile, поэтому компилятор не знает, что в нём, поэтому не знает, какой код туда можно заинлайнить вместо вызова функции по указателю. Следовательно, вызовет функцию.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 10 2018, 06:45
Сообщение #45


Гуру
******

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



Цитата(scifi @ Jul 10 2018, 09:23) *
Кое-что следует логически из того, что там написано.

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

Цитата(scifi @ Jul 10 2018, 09:23) *
У вас опасение, что при вызове функции по указателю компилятор заинлайнит код.

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

Цитата(scifi @ Jul 10 2018, 09:23) *
Причина, по которой этого не случится: указатель объявлен как volatile, поэтому компилятор не знает, что в нём, поэтому не знает, какой код туда можно заинлайнить вместо вызова функции по указателю. Следовательно, вызовет функцию.

Что значит "не знает"? Для функции есть объявление.
И если подходить логически, то что значит volatile для переменных? Он собственно означает, что порядок и количество операций доступа к данным при использовании volatile в оптимизированном коде должны быть точно такими же как в неоптимизированном. Раз в неоптимизированном коде сперва следует чтение указателя из памяти, значит компилятор при оптимизации не должен удалять такое чтение. Но вот что нельзя удалить пару инструкций BLX Rx/BX LR - это из описания volatile для данных никак не следует. Так как они не выполнят операций с памятью.
volatile накладывает ограничение на выполнение операций с объектом, а не на расположение объекта. Так что ничто не мешает ему расположить этот объект сразу после точки вызова, убрав инструкции передачи управления. Имхо.
Go to the top of the page
 
+Quote Post

6 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th April 2024 - 04:16
Рейтинг@Mail.ru


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