aiwa 0 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Имхо, в случае с указателем на функцию играет роль является ли этот указатель lvalue или нет. lvalue нельзя инлайнить, а xvalue и rvalue - можно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Я устал объяснять. Просто скажу, что вы заблуждаетесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Соответственно - для указателей на функции можно ожидать, что он не будет оптимизировать и сами функции? Не совсем понятно почему такое может быть. Функция на момент компиляции ничего не знает о существовании указателей на неё. Она даже где-то в другом модуле может быть скомпилирована и лежит себе ждёт своего часа. Остаётся взять её адрес и вызвать пока тёпленькая. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 10 июля, 2018 Опубликовано 10 июля, 2018 (изменено) · Жалоба { ((void (* volatile)())func)(); // оптимизирует несмотря на volatile. наверное потому, что получаемый указатель rvalue; } Изменено 10 июля, 2018 пользователем aiwa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба 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 Т.е. оно не заоптимизирует указатель даже если не видит переприсваиваний ему, а в нужном участке кода считает его значение и выполнит вызов функции по нему. Отчего у вас в голове родилась странная идея что внутри тела фукнции будет отключена оптимизация я не знаю. Она неверна. { ((void (* volatile)())func)(); // оптимизирует несмотря на volatile. наверное потому, что получаемый указатель rvalue; } Нет волатайл объекта - нет ограничений. Вот так уже работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Нет волатайл объекта - нет ограничений. Вот так уже работает. В одном случае работает, во втором не работает: void main() { fptr ftemp = (fptr)&func; (*ftemp)(); // работает. есть вызов. ((fptr)func)(); // не работает. происходит inline подстановка. тут rvalue } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Господа, вы научно-технические извращенцы :) Скомпилируйте функцию в отдельном модуле и никто её встраивать не будет. Про мультифайл компилэйшин знаю, но это легко не включается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба В одном случае работает, во втором не работает: А не надо делать так, чтобы не работало. Очевидно же! :biggrin: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Скомпилируйте функцию в отдельном модуле и никто её встраивать не будет. Ну-ну. А чекбокс "Inline small routines" в IAR в свойствах компоновщика не замечали? :rolleyes: А значит инлайнить может не только компилятор, но и компоновщик. Конечно косвенных вызовов это не касается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Блин, секта отрицателей инлайна, оказывается, ещё крепче :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Тут ещё extern inline не обсосали))) Помню что в стандарте это описывается. С ходу нашёл лишь https://www.ibm.com/support/knowledgecenter...ine_linkage.htm http://m68hc11.serveftp.org/inline-1.php Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Блин, секта отрицателей инлайна, оказывается, ещё крепче :) Та мелочи. Скоро придет Лесник. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба В одном случае работает, во втором не работает: void main() { fptr ftemp = (fptr)&func; (*ftemp)(); // работает. есть вызов. ((fptr)func)(); // не работает. происходит inline подстановка. тут rvalue } К чему вы это? Второй вариант снова попытка извернутся и не создавать указателя, которая закономерно заканчивается своершенно предсказуемым итогом. Если нужно гарантировать отсутствие инлайна никуда вы не отвертитись от указателя в памяти в явном виде. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба Придумал. Если функцию разместить в другой секции, то нет той силы которая её встроит. Двойное ИМХО. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aiwa 0 10 июля, 2018 Опубликовано 10 июля, 2018 · Жалоба К чему вы это? Второй вариант снова попытка извернутся и не создавать указателя, которая закономерно заканчивается своершенно предсказуемым итогом. Если нужно гарантировать отсутствие инлайна никуда вы не отвертитись от указателя в памяти в явном виде. К тому, что в Вашем конкретном примере наличие волатайл-указателя добавляет лишь заполнение его ячеек в стеке. Если его объявление заменить просто вызовом функции ничего не поменяется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться