Есть ли смысл в этом? При включении оптимизации компилятор сам старается разместить все локальные в регистрах.
Глобальные и статические в регистрах ещё как то понятно, но локальные зачем указывать?
Есть ли смысл в этом? При включении оптимизации компилятор сам старается разместить все локальные в регистрах. Глобальные и статические в регистрах ещё как то понятно, но локальные зачем указывать?
Понятно, что старается... Но у меня есть функция с несколькими локальными переменными, от скорости обращения к которым зависит, собственно, работоспособность изделия. Вот и хотелось бы иметь твёрдую гарантию, что они обязательно будут регистровыми, независимо ни от чего.
в gcc volatile вроде помещает переменную в регистр.
нет, volatile никогда нигде не давало гарантии того, что переменная окажется в регистре. volatile означает, что при любом использовании переменной надо обязательно считать ее значение. то есть для обычной переменной Var при вычислении X = Var * B + E * Var; компилятор генерирует код, который математически тождественен выражению X = Var * (B + E); а для volatile Var будет вычисляться именно так, как записано: оба упоминания переменной приведут к тому, что из памяти будут извлечены значения 2 раза.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Я сейчас прочитал про него, он определяет, что переменная должна предпочтительно помещаться в регистр (если я правильно понял). Т.е. он как-бы советует... А мне хочется твёрдой уверенности...
я бы советовал просто посмотреть листинг, чтобы увидеть, как с этими переменными компилятор поступает. локальные переменные компилятор стремится разместить в регистрах, и только слишком большое их обилие может помешать это сделать.
кроме того, по моему личному опыту, попытки перемудрить компилятор редко приводят к успеху - ваши попытки что-то улучшить при помощи модификатора register скорее всего либо не приведут вообще ни к какому эффекту (в плане увеличения быстродействия), либо дадут отрицательный результат. просто используйте максимально возможности оптимизатора по скорости - и все. во всяком случае, без анализа листинга не стоит и пытаться "оптимизировать" самостоятельно...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Советует то оно да - но если у вас нет более предпочитаемых по мнению компилятора переменных она будет записана в регистр.
В общем, у меня она всегда была в регистре. Ну... Других вариантов нет, звиняйте) Посмотрите, главное чтоб по скорости все работало - реально то все равно будет оно в регистре или нет.
... хотелось бы иметь твёрдую гарантию, что они обязательно будут регистровыми, независимо ни от чего.
Вас спасёт только ASM. IAR квалификатор "register", обычно, игнорирует.
Ну и как вариант, считаю его извращением, сделать переменную глобальной и объявить её через "__regvar".
Ну, глобальными эти переменные делать как-то не хочется... Наверно, всё-таки буду выходной листинг проверять, убеждаясь, что в нужной функции нужные переменные таки регистровые.
Всем спасибо за участие...
Вы бы проверяли просто достаточно ли производительности
При использовании переменных в RAM - однозначно недостаточно, в чём и фишка.
Вообще-то без дополнительных мер и этого не хватает - приходится ещё циклы линейными участками заменять кое-где... макросы там... и т. п. Но это всё понятно как сделать.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения