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

IAR 8.40.1, директива __forceinline

Не могу понять) Должна работать эта директива, но компилятор выдаёт сообщение

Quote

Error[Pe077]: this declaration has no storage class or type specifier 

Хотя здесь, уважаемый @lamerok её использует. Хочется более-менее 100% гарантии, что компилятор заинлайнит функцию.

В докуметации про неё не слова. На официальном сайте тоже не нашёл ничего(((

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


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

18 minutes ago, haker_fox said:

Хочется более-менее 100% гарантии, что компилятор заинлайнит функцию.

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

100% гарантии дает макрос.

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


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

13 минут назад, aaarrr сказал:

100% гарантии дает макрос.

Не даёт. :wink:  Если оптимизатор обнаружит в разных местах функции/файла (или даже всего проекта при "multi-file compilation") одинаковые (или похожие) участки кода, то (в зависимости от ключей оптимизации) он может из этого кода сам слепить функцию.

 

PS: Совсем недавно же было обсуждение касательно этого момента: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=154267&tab=comments#comment-1653253

только ТС там так ничего и не понял  :unknw:

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


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

Есть __attribute__((always_inline)) и #pragma inline=forced . Iar хорошо инлайнит при оптимизации по скорости без ограничения размера. Но всё же программист должен соблюсти условия, чтобы компилятор смог заинлайнить. Ну и решение в конечном счёте всё равно за компилятором и если он не сможет заинлайнить, ошибку не получишь.

Не холивара для, а чисто ради удовлетворения собственного любопытства. А ЗАЧЕМ?

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


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

4 minutes ago, VladislavS said:

Не холивара для, а чисто ради удовлетворения собственного любопытства. А ЗАЧЕМ?

Интереса ради) Я понимаю, что полагаться на инлайн не стоит. Но захотелось поэкспериментировать.

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


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

4 минуты назад, VladislavS сказал:

#pragma inline=forced . Iar хорошо инлайнит при оптимизации по скорости без ограничения размера.

Про "#pragma inline=forced" в мануале сказано, что "работает только на "Medium" и выше".

5 минут назад, VladislavS сказал:

А ЗАЧЕМ?

С этим согласен.  :wink:

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


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

3 minutes ago, jcxz said:

Про "#pragma inline=forced" в мануале сказано, что "работает только на "Medium" и выше".

Гм, по всему мануалу прошёлся, не нашёл. Странно...(

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


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

1 минуту назад, haker_fox сказал:

Гм, по всему мануалу прошёлся, не нашёл. Странно...(

Я смотрю по v7.80.4:

Inlining is normally performed only on the High optimization level. Specifying 
#pragma inline=forced will enable inlining of the function also on the Medium 
optimization level.

PS: Про __forceinline ничего не знаю - нет у меня совсем последней версии IAR-а.

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


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

10 минут назад, haker_fox сказал:

Интереса ради

Есть куда более интересные вещи, чем тупой инлайн. 

 

 

3 минуты назад, jcxz сказал:

PS: Про __forceinline ничего не знаю - нет у меня совсем последней версии IAR-а.

У меня есть, но я тоже не знаю :)

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


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

Гм, и ещё раз гм. Я смотрел только примеры с хабры.

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


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

1 час назад, haker_fox сказал:

но компилятор выдаёт сообщение

Может вы ее просто вставили не в то место в выражении? Неплохо бы привести сам код, на который идет ругань.

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


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

Объявление в хидере в классе

__forceinline static inline void addSensorTick( MotionSensors_t _current, MotionSensors_t _previous );

Тело функции

__forceinline inline void DigitalInputs::addSensorTick( MotionSensors_t _current, MotionSensors_t _previous ) {
    static const std::uint8_t MASK = 0x03;
    for ( auto sensorCounter = 0; sensorCounter < measure_board::SENSOR_COUNT; sensorCounter++ ) {
        std::uint8_t current = ( _current.digital.mask >> ( sensorCounter * 2 ) ) & MASK;
        std::uint8_t prev = ( _previous.digital.mask >> ( sensorCounter * 2 ) ) & MASK;
        if (current == prev)
            continue;
        bool sign = true; /// true +, false -
        switch (current) {
        case 0:
            if (prev == 2)
                sign = false;
            else if (prev == 1)
                sign = true;
            else {dprintf("%d %d\r\n", prev, current);
                configASSERT(0);
            }
            break;
        case 1:
            if (prev == 0)
                sign = false;
            else if (prev == 3)
                sign = true;
            else {
                dprintf("%d %d\r\n", prev, current);
                configASSERT(0);
            }
            break;
        case 2:
            if (prev == 3)
                sign = false;
            else if (prev == 0)
                sign = true;
            else {
                dprintf("%d %d\r\n", prev, current);
                configASSERT(0);
            }
            break;
        case 3:
            if (prev == 1)
                sign = false;
            else if (prev == 2)
                sign = true;
            else {
                dprintf("%d %d\r\n", prev, current);
                configASSERT(0);
            }
            break;
        default:
            configASSERT(0);
        }
        m_sensorTick.tick[sensorCounter] += sign ? 1 : -1;
    }
}

 

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


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

Моё мнение такое. Если вы хотите чтобы функция инлайнилась, то надо приложить усилия для выполнения условий при которых компилятор сможет это сделать, а не уговаривать компилятор. И тогда при выборе соответствующего типа/уровня оптимизации всё будет хорошо - у IAR нет с этим проблем. Ну и в современном стандарте языка директива inline это что-то типа ремарки для программиста, что надо бы с этой функцией правильно всё сделать, нежели компилятору. Клал он на неё :)

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


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

1 minute ago, VladislavS said:

И тогда при выборе соответствующего типа/уровня оптимизации всё будет хорошо - у IAR нет с этим проблем.

Я с вами согласен на все 100! повторяю, интерес академический))))

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


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

1 hour ago, jcxz said:

Не даёт. :wink:  Если оптимизатор обнаружит в разных местах функции/файла (или даже всего проекта при "multi-file compilation") одинаковые (или похожие) участки кода, то (в зависимости от ключей оптимизации) он может из этого кода сам слепить функцию.

Ну, это очень сильно постараться нужно - объемный участок с оптимизацией по размеру (а если нужно прямо-вот-непременно-заинлайнить, то кто же в своем уме будет использовать -Os?).

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


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

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

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

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

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

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

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

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

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

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