Зарегистрировать переменные - PullRequest
2 голосов
/ 02 апреля 2009

У меня есть код C ++, в котором задействовано много рекурсий. Я думаю об использовании класса регистров для моих переменных. Как вы думаете, таким образом я буду экономить память стека и улучшу производительность

Спасибо

Самир

Ответы [ 5 ]

8 голосов
/ 02 апреля 2009

Могу поспорить, что компилятор НЕ выполнит ваш запрос. Скажем, у вас есть локальная переменная и что вы рекурсивно вызываете функцию 100 раз. Если бы оно учитывало все ваши ключевые слова auto register 'register', для этой переменной потребовалось бы 100 аппаратных регистров (все переменные живы при сотом вызове)

Производительность - сложная проблема. Проанализируйте, на что программа действительно тратит время, и постарайтесь оптимизировать ее, но будьте осторожны: некоторые решения могут закончиться безрезультатно, другие могут привести к худшей производительности. Как уже упоминалось ранее, компиляторы действительно хороши в том, что они делают. Заставить переменную в регистре означает на один регистр меньше, чтобы использовать остальные переменные.

6 голосов
/ 02 апреля 2009

Нет, я думаю, что это, вероятно, не будет иметь никакого эффекта вообще. Современные компиляторы обычно намного лучше планируют использование регистров, чем люди, и, вероятно, будут игнорировать ключевое слово «register».

Сказав это, единственный реальный способ выяснить это - написать некоторый код и измерить его производительность с помощью ключевого слова register и без него - изменение кода тривиально.

1 голос
/ 02 апреля 2009

Если я правильно помню, ключевое слово register не гарантирует, что переменная будет сохранена в регистре, но указывает, что оно может и, если возможно, должно использовать регистр, однако, если регистр недоступен, то он все равно закончится в стеке.

Microsoft C ++ игнорирует ключевое слово и принимает собственные решения. Сначала я посмотрю на ваш алгоритм для повышения производительности.

1 голос
/ 02 апреля 2009

Вы можете изменить свой алгоритм так, чтобы он просто использовал std::stack и некоторый пользовательский класс, который будет содержать состояние алгоритма вместо стека функций и вызова рекурсии.

0 голосов
/ 02 апреля 2009

Компилятор на 100% может удовлетворить ваш запрос register. Конечно, вы можете сэкономить место в стеке, если вам удастся сжать локальную переменную или две в регистры, но не (конечно), если эти значения необходимо сохранить при вызовах, поскольку тогда их нужно будет снова поместить в стек.

...