|
|
|
Инлайновая функция |
|
|
|
Jul 6 2018, 11:44
|
Гуру
Группа: Свой
Сообщений: 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 Ну так это совсем не то. Это как бороться с перхотью при помощи топора Тогда уж так: #define NO_OPT _Pragma("inline=never")
|
|
|
|
|
Jul 6 2018, 15:24
|
Гуру
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713
|
Цитата(scifi @ Jul 6 2018, 15:54) Это уже паранойа какая-то. Так можно в чём угодно усомниться Впрочем, я не настаиваю, куйте своё счастье самостоятельно В мануале на IAR нет ничего про volatile для указателей на функции. Судя по контексту описания, там везде подразумевается его использование для описания данных. Поэтому и осторожничаю. Всё-таки про прагму чётко там написано: не будет инлайнится и всё тут. А как поведёт себя в последующих версия IAR с void (* volatile)() - я не уверен. Но всё равно - спасибо Вам что указали на такую возможность запрета inline. Мне самому не пришло в голову в своё время.
|
|
|
|
|
Jul 6 2018, 15:36
|
Знающий
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842
|
Цитата(Arlleex @ Jul 5 2018, 17:53) Отладить сложно неудобно в макросах, плюс проверка на соответствие типов в макросах отсутствует... ИМХО, не очень удобно. Хотя сам пользуюсь Не только лишь все умеют иронию. Цитата(jcxz @ Jul 6 2018, 14:44) Да, в текущей версии IAR это работает, но нет уверенности, что будет также работать и в последующих. В доках насчёт volatile говорится только применительно к данным, про код ничего не упоминается. Ну так у компилятора нет гарантий что волотайл указывает на тот код который он думает, поэтому оптимизировать инлайном он не имеет права.
|
|
|
|
|
Jul 7 2018, 05:45
|
Профессионал
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075
|
вобщем вдруг осенило. вспомнил Код #define Foo() do{ } while (0); вот тебе бабушка и юрьев день инлайн а впринципе я тут посчитал - что мы экономим на инлайне - 8-10 инструкций - 100-200 наносекунд - наверно это не существенно. разве это спасет отца русской демократии?
Сообщение отредактировал Jenya7 - Jul 7 2018, 05:52
|
|
|
|
|
Jul 9 2018, 18:49
|
Местный
Группа: Участник
Сообщений: 492
Регистрация: 12-11-11
Пользователь №: 68 264
|
Цитата(Jenya7 @ Jul 7 2018, 08:45) вобщем вдруг осенило. вспомнил Код #define Foo() do{ } while (0); вот тебе бабушка и юрьев день инлайн а впринципе я тут посчитал - что мы экономим на инлайне - 8-10 инструкций - 100-200 наносекунд - наверно это не существенно. разве это спасет отца русской демократии? Только без точки с запятой в конце.
|
|
|
|
|
Jul 9 2018, 20:12
|
Местный
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682
|
Цитата(Kabdim @ Jul 9 2018, 04:10) Сильно удивляете. Стандарт на язык читать надо, а не иаровский мануал. Похоже на то, что стандарт не в курсе дела.
|
|
|
|
|
Jul 10 2018, 06:23
|
Гуру
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136
|
Цитата(jcxz @ Jul 10 2018, 09:17) Можете привести выдержку из стандартна касательно этого? Стандарт не обязан разжёвывать каждую ситуацию. Кое-что следует логически из того, что там написано. У вас опасение, что при вызове функции по указателю компилятор заинлайнит код. Причина, по которой этого не случится: указатель объявлен как volatile, поэтому компилятор не знает, что в нём, поэтому не знает, какой код туда можно заинлайнить вместо вызова функции по указателю. Следовательно, вызовет функцию.
|
|
|
|
|
Jul 10 2018, 06: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 накладывает ограничение на выполнение операций с объектом, а не на расположение объекта. Так что ничто не мешает ему расположить этот объект сразу после точки вызова, убрав инструкции передачи управления. Имхо.
|
|
|
|
|
|
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|
|