Jump to content

    
Sign in to follow this  
haker_fox

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

Recommended Posts

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

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this