оптимизация статической функции, на которую ссылаются один раз - PullRequest
3 голосов
/ 18 февраля 2011

Я пишу встроенный код для MSP430, используя компилятор IAR на самом высоком уровне оптимизации (скорость или размер ничего не меняют).

Я определяю функцию как статическую, а затем ссылаюсь на нее только один раз в одном и том же файле. Поскольку функция имеет внутреннюю связь и используется ровно один раз, я ожидал, что оптимизатор выполнит встроенное расширение. Я не вижу причин, чтобы этого не делать.

Функция короткая, в результате получается 16 слов машинного кода. Это называется из ISR. Добавление ключевого слова inline делает функцию встроенной, но оптимизатору, похоже, нужна подсказка. Если он встроен, то в стеке сохраняются два push / pop, один calla и один reta.

.

Правильно ли ожидать, что будет выполнено встроенное расширение (даже без ключевого слова inline), или я что-то упустил?


Редактировать: еще несколько тестов показали, что линейное расширение зависит от размера функции, и что порог был довольно низким. Кажется, около 15 или 16 слов машинного кода. Кроме того, оптимизатор не расширяется, если не указано ключевое слово.

Я до сих пор не понимаю, почему это не так (читабельность не должна заботить оптимизатора, не так ли?), Но я понимаю, что IAR может ответить только на это.

Ответы [ 3 ]

2 голосов
/ 19 февраля 2011

Компилятору не требуется встроенный код (даже если он явно помечен inline), а оптимизаторы различаются по сложности и стратегии.Так что это действительно вопрос для вашего поставщика компилятора (также может помочь обращение к документации).

Если функция особенно велика, компилятор, возможно, принял решение о том, что избежание накладных расходов на вызов функции было незначительным в общей схеме.

Ваш компилятор может иметь ключевое слово _force_inline или подобное, которое будет рассматриваться как директива, а не предложение (как обычно inline в большинстве компиляторов).

Один возможный аргументдля не встраивания, это для поддержания детерминированной производительности при обслуживании.Если более поздняя вторая ссылка привела к тому, что он больше не будет встроенным, скорость выполнения вашего кода может измениться таким образом, что это может отрицательно сказаться на требованиях к производительности вашего приложения, в то время как сохранение встроенного кода может значительно повлиять на размер кода. [править] При чтении документации на вашем компиляторе директива #pragma inline=forced требуется непосредственно перед определением функции, в противном случае встраивание зависит от эвристики оптимизатора.Даже при форсировании оптимизация не будет происходить при низкой или без оптимизации.

2 голосов
/ 18 февраля 2011

Я использую версию компилятора IAR ARM, которой несколько лет (v5.2);насколько это может относиться к компилятору MSP430, я понятия не имею.

Компилятор IAR ARM включает статические функции, которые для меня явно не помечены inline, используя любые «высокие» параметры оптимизации, -Oh (сбалансированный), -Ohs (скорость) или -Ohz (размер) - включая статические функции с некоторой степенью сложности (например, циклы).

Конечно, я представляю, что есть некоторые статические функции, которые не являются встроенными, но быстрая проверка показывает, что компилятор IAR выполняет эту оптимизацию в целом.

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

0 голосов
/ 20 февраля 2012

По словам сотрудника IAR в этой теме Оптимизация размера IAR и встроенные функции :

Официально это поддерживается только в том случае, если компилятор видит определение в заголовочном файле или втот же исходный файл.Тем не менее, в качестве эксперимента мы опробовали нечто, называемое «многофайловой компиляцией», где вы можете одновременно подавать несколько файлов C на компилятор, позволяя встроить его между модулями компиляции.Обратите внимание, что это чисто экспериментально, и среда IDE не поддерживает его.

...

Лично, если бы я написал приложение сегодня, я бы не использовал опцию --mfc.Вместо этого я бы поместил функцию, которую я хотел бы встроить, в заголовочные файлы, как и вы, когда пишете определения классов C ++ встроенными методами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...