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

 
 
6 страниц V  « < 2 3 4 5 6 >  
Reply to this topicStart new topic
> Инлайновая функция
aiwa
сообщение Jul 10 2018, 06:55
Сообщение #46


Местный
***

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



Имхо, в случае с указателем на функцию играет роль является ли этот указатель lvalue или нет.

lvalue нельзя инлайнить, а xvalue и rvalue - можно.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 10 2018, 06:55
Сообщение #47


Гуру
******

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



Я устал объяснять. Просто скажу, что вы заблуждаетесь.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 10 2018, 07:10
Сообщение #48


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



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

Не совсем понятно почему такое может быть. Функция на момент компиляции ничего не знает о существовании указателей на неё. Она даже где-то в другом модуле может быть скомпилирована и лежит себе ждёт своего часа. Остаётся взять её адрес и вызвать пока тёпленькая.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jul 10 2018, 07:11
Сообщение #49


Местный
***

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



{
((void (* volatile)())func)(); // оптимизирует несмотря на volatile. наверное потому, что получаемый указатель rvalue;
}

Сообщение отредактировал aiwa - Jul 10 2018, 07:11
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 10 2018, 10:29
Сообщение #50


Знающий
****

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



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;
}

Нет волатайл объекта - нет ограничений. Вот так уже работает.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jul 10 2018, 11:32
Сообщение #51


Местный
***

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



Цитата(Kabdim @ Jul 10 2018, 13:29) *
Нет волатайл объекта - нет ограничений. Вот так уже работает.


В одном случае работает, во втором не работает:
Код
void main()
{
    fptr ftemp = (fptr)&func;
    (*ftemp)();                      // работает. есть вызов.  
    ((fptr)func)();                  // не работает. происходит inline подстановка.   тут rvalue  
}

Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 10 2018, 11:41
Сообщение #52


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Господа, вы научно-технические извращенцы sm.gif Скомпилируйте функцию в отдельном модуле и никто её встраивать не будет. Про мультифайл компилэйшин знаю, но это легко не включается.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jul 10 2018, 11:51
Сообщение #53


Гуру
******

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



Цитата(aiwa @ Jul 10 2018, 14:32) *
В одном случае работает, во втором не работает:

А не надо делать так, чтобы не работало. Очевидно же! biggrin.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 10 2018, 11:56
Сообщение #54


Гуру
******

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



Цитата(VladislavS @ Jul 10 2018, 14:41) *
Скомпилируйте функцию в отдельном модуле и никто её встраивать не будет.

Ну-ну. А чекбокс "Inline small routines" в IAR в свойствах компоновщика не замечали? rolleyes.gif
А значит инлайнить может не только компилятор, но и компоновщик. Конечно косвенных вызовов это не касается.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 10 2018, 12:01
Сообщение #55


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Блин, секта отрицателей инлайна, оказывается, ещё крепче sm.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jul 10 2018, 12:26
Сообщение #56


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

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



Тут ещё extern inline не обсосали)))

Помню что в стандарте это описывается.
С ходу нашёл лишь

https://www.ibm.com/support/knowledgecenter...ine_linkage.htm
http://m68hc11.serveftp.org/inline-1.php


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


Местный
***

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



Цитата(VladislavS @ Jul 10 2018, 15:01) *
Блин, секта отрицателей инлайна, оказывается, ещё крепче sm.gif

Та мелочи. Скоро придет Лесник.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Jul 10 2018, 13:49
Сообщение #58


Знающий
****

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



Цитата(aiwa @ Jul 10 2018, 14:32) *
В одном случае работает, во втором не работает:
Код
void main()
{
    fptr ftemp = (fptr)&func;
    (*ftemp)();                      // работает. есть вызов.  
    ((fptr)func)();                  // не работает. происходит inline подстановка.   тут rvalue  
}

К чему вы это? Второй вариант снова попытка извернутся и не создавать указателя, которая закономерно заканчивается своершенно предсказуемым итогом. Если нужно гарантировать отсутствие инлайна никуда вы не отвертитись от указателя в памяти в явном виде.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Jul 10 2018, 14:33
Сообщение #59


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Придумал. Если функцию разместить в другой секции, то нет той силы которая её встроит. Двойное ИМХО.
Go to the top of the page
 
+Quote Post
aiwa
сообщение Jul 10 2018, 14:36
Сообщение #60


Местный
***

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



Цитата(Kabdim @ Jul 10 2018, 16:49) *
К чему вы это? Второй вариант снова попытка извернутся и не создавать указателя, которая закономерно заканчивается своершенно предсказуемым итогом. Если нужно гарантировать отсутствие инлайна никуда вы не отвертитись от указателя в памяти в явном виде.


К тому, что в Вашем конкретном примере наличие волатайл-указателя добавляет лишь заполнение его ячеек в стеке.
Если его объявление заменить просто вызовом функции ничего не поменяется.
Go to the top of the page
 
+Quote Post

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

 


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


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