Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Инлайновая функция
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Страницы: 1, 2
Jenya7
Если я определяю функцию как инлайн
Код
файл .h
inline uint32_t SYSTIME_GetSystemTime(void);
файл .с
inline uint32_t SYSTIME_GetSystemTime(void)
{  
    //do something
}
то при вызове функции IAR ругается Error[Li005]: no definition for "SYSTIME_GetSystemTime"
то есть функцию надо разместить в .h файле по другому никак?
aaarrr
Цитата(Jenya7 @ Jul 5 2018, 11:57) *
то есть функцию надо разместить в .h файле по другому никак?

А как иначе компилятор получит тело функции для встраивания?
scifi
Зачем вам этот инлайн? Включайте в яре "multifile compilation" и оптимизацию, он сам заинлайнит получше любых вот этих потуг.
Jenya7
Цитата(scifi @ Jul 5 2018, 14:16) *
Зачем вам этот инлайн? Включайте в яре "multifile compilation" и оптимизацию, он сам заинлайнит получше любых вот этих потуг.


так он заинлайнит все функции. а мне нужно несколько.

Цитата(aaarrr @ Jul 5 2018, 14:13) *
А как иначе компилятор получит тело функции для встраивания?

я думал как и обычные функции - из .h файла
scifi
Цитата(Jenya7 @ Jul 5 2018, 13:37) *
так он заинлайнит все функции

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

Цитата(Jenya7 @ Jul 5 2018, 13:37) *
а мне нужно несколько.

Интересно, зачем? Нет, правда интересно.
VladislavS
Свидетели секты пресвятого инлайна. excl.gif
Jenya7
Цитата(scifi @ Jul 5 2018, 15:49) *
Ну это вряд ли, зависит от настроек оптимизации и характера кода. А даже если и все, что за печаль?


Интересно, зачем? Нет, правда интересно.

ну если все то размер кода вырастит в 10 раз. а это довольно печально.я конечно обеими руками за скорость исполнения но раздувать код до немыслимых пределов я не могу. поэтому и существует трейдофф.


Цитата(VladislavS @ Jul 5 2018, 16:05) *
Свидетели секты пресвятого инлайна. excl.gif

если вам не нужен инлайн то наверно вам можно только позавидовать.
Arlleex
Цитата(Jenya7 @ Jul 5 2018, 15:09) *
если вам не нужен инлайн то наверно вам можно только позавидовать.

Я Вас уверяю, компилятор может посчитать, что и Вам inline, собственно, не нужен, и не станет вставлять тело функции, а вызовет ее.
jcxz
Цитата(Jenya7 @ Jul 5 2018, 14:09) *
если вам не нужен инлайн то наверно вам можно только позавидовать.

Вы как бы даже не задумались, что подобные проблемы здесь на форуме возникают только у Вас? Совсем ни о чём не говорит? biggrin.gif
VladislavS
Среди программистов ходит байка, что некоторые компиляторы, видя в коде больше N инлайнов, решают что юзер дурак и забивают на них.

Цитата(jcxz @ Jul 5 2018, 14:15) *
Вы как бы даже не задумались, что подобные проблемы здесь на форуме возникают только у Вас? Совсем ни о чём не говорит? biggrin.gif

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

Цитата(Jenya7 @ Jul 5 2018, 14:09) *
ну если все то размер кода вырастит в 10 раз.

Где такую забористую @$# берёте? В IAR поставьте оптимизацию Balanced и забудьте раз и навсегда.
scifi
Цитата(VladislavS @ Jul 5 2018, 14:31) *
Где такую забористую @$# берёте? В IAR поставьте оптимизацию Balanced и забудьте раз и навсегда.

Вот-вот, я в эту же сторону намекаю beer.gif
Этот инлайн - тяжёлое наследие кровавого прошлого, когда сердобольные кодеры читали листинг дизассемблера и рыдали от горя.
demiurg_spb
Код
файл .h
static inline uint32_t SYSTIME_GetSystemTime(void)
{  
    //do something
}
и всё
Kabdim
Четкие пацаны, которым нужен четкий инлайн пишут не функции, а макросы. Ну а потом уже разбираются с этим счастьем.
jcxz
Цитата(Kabdim @ Jul 5 2018, 16:25) *
Четкие пацаны, которым нужен четкий инлайн пишут не функции, а макросы. Ну а потом уже разбираются с этим счастьем.

Поддерживаю. rolleyes.gif
Arlleex
Цитата(Kabdim @ Jul 5 2018, 17:25) *
Четкие пацаны, которым нужен четкий инлайн пишут не функции, а макросы. Ну а потом уже разбираются с этим счастьем.

Отладить сложно неудобно в макросах, плюс проверка на соответствие типов в макросах отсутствует... ИМХО, не очень удобно. Хотя сам пользуюсь biggrin.gif
scifi
Цитата(Kabdim @ Jul 5 2018, 16:25) *
Четкие пацаны, которым нужен четкий инлайн пишут не функции, а макросы. Ну а потом уже разбираются с этим счастьем.

В основном потому, что инлайн - нестандартное расширение.
Но дело даже не в этом. Вот не могу себе представить, где это реально может понадобиться. Вернее, могу, но это будет оч. экзотический случай. В 99% случаев это можно отдать на откуп современному компилятору. Он умеет инлайнить сам без подсказок, причём функции из разных файлов без тела функции в хедере.
technik-1017
inline нужен, например, для функций в прерываниях, чтобы не допускать разрастания стека (о скорости выполнения уже говорили).

использование inline ещё не говорит о том, что функция будет сто процентов инлайниться. Для принудительного инланинга необходимо использования директиву
#pragma inline = forced
esaulenka
Цитата(scifi @ Jul 5 2018, 17:59) *
инлайн - нестандартное расширение.

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

Цитата(scifi @ Jul 5 2018, 17:59) *
Но дело даже не в этом. Вот не могу себе представить, где это реально может понадобиться.

Например, какой-то макросозаменитель, вычисление которого быстрее, чем перекладывание параметров в нужном порядке по регистрам. Да, скорее всего компилятор проявит интеллект и сам заинлайнит. А может и нет. Проще подсказать.
jcxz
Цитата(scifi @ Jul 5 2018, 17:59) *
Но дело даже не в этом. Вот не могу себе представить, где это реально может понадобиться.

Результат компиляции функции-макроса, часто порождает более оптимальный код, чем результат оптимизации даже хорошего компилятора - оптимизаторы пока не идеальны.
Да и иногда полезно при отладке (без оптимизации) иметь обязательный инлайнинг. А inline в си к сожалению вещь опциональная - на усмотрение компилятора. По-крайней мере в IAR.
А ещё бывает нужно в качестве аргумента передать несуществующее значение, которое внутри макроса, конкатенируясь, даст реальные переменные/константы. Такой финт с inline-функцией не провернёшь.
А ещё бывает желательно проверять валидность аргументов функции. В обычной функции (или inline) можно сделать такую проверку только с порождением кода и работающую в run-time. В макросе можно сделать проверку в build-time, не порождающую лишнего кода.
Сергей Борщ
QUOTE (esaulenka @ Jul 5 2018, 22:49) *
Можно пользоваться языком, у которого ключевое слово "инлайн" прописано в стандарте.
Кстати, да. Оно есть в голых Сях уже лет семь.
VladislavS
Начиная с C++11 в каждой новой спецификации добавляются всё новые возможности выполнения кода на этапе компиляции. Это сейчас модно, а не инлайны, с которыми компиляторы уже давным-давно научились сами разбираться. Попереключайте настройки оптимизатора и посмотрите результаты компиляции. Адептам секты пресвятого инлайна смотреть результат оптимизации с ключом Size на максимуме не рекомендую , чтобы при виде сплошного антиинлайна не возникли суицидалные мысли.

Сейчас мэинстрим чтобы программа вообще не порождала run-time кода sm.gif Модно написать программу на несколько страниц и получить пару ассемблерных команд. Даже соревнования проходят кто больше кода на этапе компиляции выполнит.

И тут очередной такой ТС с давно уже неактуальным инлайном на белом коне въезжает. Совет ТС - если у вас есть место где не проходите по скорости, а иначе зачем гнаться за инлайном, то лучше перепишите этот кусок более оптимально наблюдая за результатом компиляции. Может даже с уходом в ASM. Но надеяться на инлайн не стоит. Даже если вы директиву принудительного инлайна поставите, компилятор может её проигнорировать. Не из вредности, а из-за продвинутости оптимизатора.

Кстати, приёмов оптимизации в арсенале компилятора очень много, но почему-то только инлайн так волнует души неокрепших программистов sm.gif Почему вас раскручивание циклов вообще не волнует, а? wink.gif
scifi
Цитата(VladislavS @ Jul 6 2018, 06:48) *
Модно написать программу на несколько страниц и получить пару ассемблерных команд. Даже соревнования проходят кто больше кода на этапе компиляции выполнит.

Это же легко: Евгения Онегина в комментарий скопипастить - и дело в шляпе biggrin.gif
Есть ещё соревнования по созданию самых непонятным программам: тыц.
jcxz
Цитата(VladislavS @ Jul 6 2018, 06:48) *
Почему вас раскручивание циклов вообще не волнует, а? wink.gif

Это точно sm.gif
Мне здесь на форуме один товарищ недавно рассказывал и пытался убеждать, что копирование через memcpy() в любом случае быстрее, чем написать это копирование простым циклом на си. Сколько я ему не намекал, что оптимизирующий компилятор может и этот цикл и даже саму memcpy(!) раскрутить в несколько ассемблерных инструкций (в зависимости от размера пересылки, выравниваний и известности параметров пересылки на этапе компиляции), а может и то и другое заменить просто оптимальным циклом с копированием внутри - так и не убедил его. Он только обиделся. Он приводил в доказательство какие-то частные случаи, в определённых созданных им условиях.
Так он и не понял, что при включении максимальной оптимизации и чем лучше и продвинутее компилятор, тем результат будет больше зависеть от реализуемого действия (алгоритма), а не от способа его реализации (цикл-ли, инлайн или даже memcpy).
Так и ТС здесь - уверен что что-то зависит от того, с inline он напишет функцию или без. wink.gif
Так что как я неоднократно убеждался - понимание принципов работы оптимизаторов ускользает от основной массы программистов, сколько не описывай это в мануалах. Ну и в результирующий ассемблерный код тоже как видно мало кто смотрит и понимает его. Иначе бы даже без мануалов всё было понятно.

PS: Кстати - вдогонку, в тему: Иногда возникает желание сказать компилятору (IAR в частности), чтобы он не inline-ил функцию. Так это сделать посложнее чем сказать inline.
А вот сделать функцию жёстко "не inline" вне зависимости от работы оптимизатора - это имхо гораздо полезнее чем сделать её inline.
scifi
Цитата(jcxz @ Jul 6 2018, 10:27) *
Мне здесь на форуме один товарищ недавно рассказывал и пытался убеждать, что копирование через memcpy() в любом случае быстрее, чем написать это копирование простым циклом на си. Сколько я ему не намекал, что оптимизирующий компилятор может и этот цикл и даже саму memcpy(!) раскрутить в несколько ассемблерных инструкций (в зависимости от размера пересылки, выравниваний и известности параметров пересылки на этапе компиляции), а может и то и другое заменить просто оптимальным циклом с копированием внутри - так и не убедил его. Он только обиделся. Он приводил в доказательство какие-то частные случаи, в определённых созданных им условиях.

Был случай, когда хотелось, чтобы memcpy был маленький и медленный. Скорость не нужна, а байтов жалко. Библиотечный memcpy шибко умный, видимо. Ускоренный настолько, что весит сотни байт :-( Хоть заменяй своим.

Цитата(jcxz @ Jul 6 2018, 10:27) *
PS: Кстати - вдогонку, в тему: Иногда возникает желание сказать компилятору (IAR в частности), чтобы он не inline-ил функцию. Так это сделать посложнее чем сказать inline.
А вот сделать функцию жёстко "не inline" вне зависимости от работы оптимизатора - это имхо гораздо полезнее чем сделать её inline.

Очевидно же: взять адрес функции, загнать его в указатель volatile, не? И вызывать через этот указатель для верности.
jcxz
Цитата(scifi @ Jul 6 2018, 10:36) *
Был случай, когда хотелось, чтобы memcpy был маленький и медленный. Скорость не нужна, а байтов жалко. Библиотечный memcpy шибко умный, видимо. Ускоренный настолько, что весит сотни байт :-( Хоть заменяй своим.

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

Цитата(scifi @ Jul 6 2018, 10:36) *
Очевидно же: взять адрес функции, загнать его в указатель volatile, не? И вызывать через этот указатель для верности.

Не уверен что это прокатит с любым компилятором. Да, указатель он создаст, и пожалуй даже поставит команду LDR Rx, указатель. Но кто дальше ему мешает просто вставить код функции? Ведь все условия volatile указателя он уже выполнил: создал его, и чтение его выполнил.

PS: Про #pragma inline=never знаю и его сейчас и использую в IAR. Но это компиляторо-зависимо.
demiurg_spb
Цитата(jcxz @ Jul 6 2018, 10:51) *
А в IAR разве нет атрибутов наподобие gcc и keil?
У меня написан compiler.h в котором все нюансы компиляторов запрятаны. Типа
Код
#if defined(__GNUC__)
#      define __is_always_inline   __inline__ __attribute__((__always_inline__))
#endif

А пользовательский код никаких специфических вещей компиляторов не использует - только свою прослойку.
Код
static __is_always_inline void foo(void)
{
    // do something
}
ИМХО прагмы в коде последнее дело...
jcxz
Цитата(demiurg_spb @ Jul 6 2018, 14:13) *
А в IAR разве нет атрибутов наподобие gcc и keil?

Атрибутов не знаю, знаю только прагмы. И тогда Ваш compiler.h - неверный.

Цитата(demiurg_spb @ Jul 6 2018, 14:13) *
ИМХО прагмы в коде последнее дело...

Согласен. Но я не знаю другого способа явно указать IAR-у - инлайнить или нет. sad.gif
scifi
Цитата(jcxz @ Jul 6 2018, 10:51) *
Но кто дальше ему мешает просто вставить код функции?

Как кто? Вызов функции по указателю volatile. Он же не знает, что там в этом указателе (он же volatile!), поэтому именно вызовет функцию по указателю без всяких инлайнов. И заметьте, это чистый Си, без всяких прагм и атрибутов.
VladislavS
Цитата(jcxz @ Jul 6 2018, 14:23) *
Но я не знаю другого способа явно указать IAR-у - инлайнить или нет. sad.gif

Не знаю с какой версии, но
Цитата
In extended language mode, the IAR C/C++ Compiler also supports a limited selection
of GCC-style attributes. Use the __attribute__ ((attribute-list)) syntax for
these attributes.
The following attributes are supported in part or in whole. For more information, see the
GCC documentation.
● alias
● aligned
● always_inline
● cmse_nonsecure_call
● cmse_nonsecure_entry
● constructor
● deprecated
● noinline
● noreturn
● packed
● pcs (for IAR type attributes used on functions)
● section
● target (for IAR object attributes used on functions)
● transparent_union
● unused
● used
● volatile
● weak
demiurg_spb
Немного погуглив нашёл _Pragma(...)
Код
#ifdef IAR
        #define NO_OPT _Pragma ("optimize=none")
#endif

NO_OPT void some_func(void)
{

}
jcxz
Цитата(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")
demiurg_spb
Цитата(jcxz @ Jul 6 2018, 14:44) *
Ну так это совсем не то.
То, то.
ИМХО внутри _Pragma(...) можно всё что угодно написать (даже "inline = forced") и задефайнить...
scifi
Цитата(jcxz @ Jul 6 2018, 14:44) *
Да, в текущей версии IAR это работает, но нет уверенности, что будет также работать и в последующих.
В доках насчёт volatile говорится только применительно к данным, про код ничего не упоминается.

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

В мануале на IAR нет ничего про volatile для указателей на функции. Судя по контексту описания, там везде подразумевается его использование для описания данных. Поэтому и осторожничаю.
Всё-таки про прагму чётко там написано: не будет инлайнится и всё тут.
А как поведёт себя в последующих версия IAR с void (* volatile)() - я не уверен.
Но всё равно - спасибо Вам что указали на такую возможность запрета inline. Мне самому не пришло в голову в своё время. rolleyes.gif
Kabdim
Цитата(Arlleex @ Jul 5 2018, 17:53) *
Отладить сложно неудобно в макросах, плюс проверка на соответствие типов в макросах отсутствует... ИМХО, не очень удобно. Хотя сам пользуюсь biggrin.gif

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

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

Вы полагаете, что способ предложенный scifi, не только сделает функцию явно не-инлайновой, но и запретит оптимизацию её кода? хмм.... если это так, то тогда этот способ некошерный...
Jenya7
вобщем вдруг осенило. вспомнил
Код
#define Foo() do{ } while (0);
вот тебе бабушка и юрьев день инлайн

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

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

И на каком основании Вы делаете такой вывод? Перечитал в мануале на IAR всё что касается volatile - там ни слова об указателях на функции.
Kabdim
Сильно удивляете. Стандарт на язык читать надо, а не иаровский мануал.
Arlleex
Цитата(Jenya7 @ Jul 7 2018, 08:45) *
вобщем вдруг осенило. вспомнил
Код
#define Foo() do{ } while (0);
вот тебе бабушка и юрьев день инлайн

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

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

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

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

Стандарт не обязан разжёвывать каждую ситуацию. Кое-что следует логически из того, что там написано.
У вас опасение, что при вызове функции по указателю компилятор заинлайнит код. Причина, по которой этого не случится: указатель объявлен как volatile, поэтому компилятор не знает, что в нём, поэтому не знает, какой код туда можно заинлайнить вместо вызова функции по указателю. Следовательно, вызовет функцию.
jcxz
Цитата(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 накладывает ограничение на выполнение операций с объектом, а не на расположение объекта. Так что ничто не мешает ему расположить этот объект сразу после точки вызова, убрав инструкции передачи управления. Имхо.
aiwa
Имхо, в случае с указателем на функцию играет роль является ли этот указатель lvalue или нет.

lvalue нельзя инлайнить, а xvalue и rvalue - можно.
scifi
Я устал объяснять. Просто скажу, что вы заблуждаетесь.
VladislavS
Цитата(jcxz @ Jul 10 2018, 09:45) *
Соответственно - для указателей на функции можно ожидать, что он не будет оптимизировать и сами функции?

Не совсем понятно почему такое может быть. Функция на момент компиляции ничего не знает о существовании указателей на неё. Она даже где-то в другом модуле может быть скомпилирована и лежит себе ждёт своего часа. Остаётся взять её адрес и вызвать пока тёпленькая.
aiwa
{
((void (* volatile)())func)(); // оптимизирует несмотря на volatile. наверное потому, что получаемый указатель rvalue;
}
Kabdim
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;
}

Нет волатайл объекта - нет ограничений. Вот так уже работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.