Перейти к содержанию
    

Инлайновая функция

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

 

lvalue нельзя инлайнить, а xvalue и rvalue - можно.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Соответственно - для указателей на функции можно ожидать, что он не будет оптимизировать и сами функции?

Не совсем понятно почему такое может быть. Функция на момент компиляции ничего не знает о существовании указателей на неё. Она даже где-то в другом модуле может быть скомпилирована и лежит себе ждёт своего часа. Остаётся взять её адрес и вызвать пока тёпленькая.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

{

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

}

Изменено пользователем aiwa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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;

}

Нет волатайл объекта - нет ограничений. Вот так уже работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет волатайл объекта - нет ограничений. Вот так уже работает.

 

В одном случае работает, во втором не работает:

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Господа, вы научно-технические извращенцы :) Скомпилируйте функцию в отдельном модуле и никто её встраивать не будет. Про мультифайл компилэйшин знаю, но это легко не включается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В одном случае работает, во втором не работает:

А не надо делать так, чтобы не работало. Очевидно же! :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скомпилируйте функцию в отдельном модуле и никто её встраивать не будет.

Ну-ну. А чекбокс "Inline small routines" в IAR в свойствах компоновщика не замечали? :rolleyes:

А значит инлайнить может не только компилятор, но и компоновщик. Конечно косвенных вызовов это не касается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Помню что в стандарте это описывается.

С ходу нашёл лишь

 

https://www.ibm.com/support/knowledgecenter...ine_linkage.htm

http://m68hc11.serveftp.org/inline-1.php

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Блин, секта отрицателей инлайна, оказывается, ещё крепче :)

Та мелочи. Скоро придет Лесник.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В одном случае работает, во втором не работает:

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

К чему вы это? Второй вариант снова попытка извернутся и не создавать указателя, которая закономерно заканчивается своершенно предсказуемым итогом. Если нужно гарантировать отсутствие инлайна никуда вы не отвертитись от указателя в памяти в явном виде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Придумал. Если функцию разместить в другой секции, то нет той силы которая её встроит. Двойное ИМХО.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К чему вы это? Второй вариант снова попытка извернутся и не создавать указателя, которая закономерно заканчивается своершенно предсказуемым итогом. Если нужно гарантировать отсутствие инлайна никуда вы не отвертитись от указателя в памяти в явном виде.

 

К тому, что в Вашем конкретном примере наличие волатайл-указателя добавляет лишь заполнение его ячеек в стеке.

Если его объявление заменить просто вызовом функции ничего не поменяется.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...