Jump to content

    

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

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

Quote

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

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

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

Share this post


Link to post
Share on other sites
18 minutes ago, haker_fox said:

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

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

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

Share this post


Link to post
Share on other sites
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:

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
4 minutes ago, VladislavS said:

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

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

Share this post


Link to post
Share on other sites
4 минуты назад, VladislavS сказал:

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

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

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

А ЗАЧЕМ?

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

Share this post


Link to post
Share on other sites
3 minutes ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites
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-а.

Share this post


Link to post
Share on other sites
10 минут назад, haker_fox сказал:

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

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

 

 

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 час назад, haker_fox сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
1 minute ago, VladislavS said:

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

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

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now