haker_fox 61 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба Не могу понять) Должна работать эта директива, но компилятор выдаёт сообщение Quote Error[Pe077]: this declaration has no storage class or type specifier Хотя здесь, уважаемый @lamerok её использует. Хочется более-менее 100% гарантии, что компилятор заинлайнит функцию. В докуметации про неё не слова. На официальном сайте тоже не нашёл ничего((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба 18 minutes ago, haker_fox said: Хочется более-менее 100% гарантии, что компилятор заинлайнит функцию. Если мне память не изменяет, эта директива и раньше ничего на деле не гарантировала. Возможно, поэтому и убрали. 100% гарантии дает макрос. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба 13 минут назад, aaarrr сказал: 100% гарантии дает макрос. Не даёт. Если оптимизатор обнаружит в разных местах функции/файла (или даже всего проекта при "multi-file compilation") одинаковые (или похожие) участки кода, то (в зависимости от ключей оптимизации) он может из этого кода сам слепить функцию. PS: Совсем недавно же было обсуждение касательно этого момента: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=154267&tab=comments#comment-1653253 только ТС там так ничего и не понял Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба Есть __attribute__((always_inline)) и #pragma inline=forced . Iar хорошо инлайнит при оптимизации по скорости без ограничения размера. Но всё же программист должен соблюсти условия, чтобы компилятор смог заинлайнить. Ну и решение в конечном счёте всё равно за компилятором и если он не сможет заинлайнить, ошибку не получишь. Не холивара для, а чисто ради удовлетворения собственного любопытства. А ЗАЧЕМ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба 4 minutes ago, VladislavS said: Не холивара для, а чисто ради удовлетворения собственного любопытства. А ЗАЧЕМ? Интереса ради) Я понимаю, что полагаться на инлайн не стоит. Но захотелось поэкспериментировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба 4 минуты назад, VladislavS сказал: #pragma inline=forced . Iar хорошо инлайнит при оптимизации по скорости без ограничения размера. Про "#pragma inline=forced" в мануале сказано, что "работает только на "Medium" и выше". 5 минут назад, VladislavS сказал: А ЗАЧЕМ? С этим согласен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба 3 minutes ago, jcxz said: Про "#pragma inline=forced" в мануале сказано, что "работает только на "Medium" и выше". Гм, по всему мануалу прошёлся, не нашёл. Странно...( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба 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-а. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба 10 минут назад, haker_fox сказал: Интереса ради Есть куда более интересные вещи, чем тупой инлайн. 3 минуты назад, jcxz сказал: PS: Про __forceinline ничего не знаю - нет у меня совсем последней версии IAR-а. У меня есть, но я тоже не знаю :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба Гм, и ещё раз гм. Я смотрел только примеры с хабры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба 1 час назад, haker_fox сказал: но компилятор выдаёт сообщение Может вы ее просто вставили не в то место в выражении? Неплохо бы привести сам код, на который идет ругань. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба Объявление в хидере в классе __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; } } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба Моё мнение такое. Если вы хотите чтобы функция инлайнилась, то надо приложить усилия для выполнения условий при которых компилятор сможет это сделать, а не уговаривать компилятор. И тогда при выборе соответствующего типа/уровня оптимизации всё будет хорошо - у IAR нет с этим проблем. Ну и в современном стандарте языка директива inline это что-то типа ремарки для программиста, что надо бы с этой функцией правильно всё сделать, нежели компилятору. Клал он на неё :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 61 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба 1 minute ago, VladislavS said: И тогда при выборе соответствующего типа/уровня оптимизации всё будет хорошо - у IAR нет с этим проблем. Я с вами согласен на все 100! повторяю, интерес академический)))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 1 ноября, 2019 Опубликовано 1 ноября, 2019 · Жалоба 1 hour ago, jcxz said: Не даёт. Если оптимизатор обнаружит в разных местах функции/файла (или даже всего проекта при "multi-file compilation") одинаковые (или похожие) участки кода, то (в зависимости от ключей оптимизации) он может из этого кода сам слепить функцию. Ну, это очень сильно постараться нужно - объемный участок с оптимизацией по размеру (а если нужно прямо-вот-непременно-заинлайнить, то кто же в своем уме будет использовать -Os?). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться