Сколько памяти может расти при переходе на 64бит?

при перемещении приложения с 32bit на 64bit, где произойдет увеличение использования памяти?

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

где еще увеличится использование памяти? Есть ли где-нибудь, что это уменьшится, или где неарифметические операции будут видеть преимущество скорости?

4 ответов


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

Что касается скорости, вы можете испытывать замедления из-за увеличения использования памяти. Кэш CPU будет заполняться быстрее.

Я видел значительные преимущества скорости от x86 до x64, потому что x86 имеет гораздо меньше регистров, чем архитектура x64. Компиляторы используют дополнительные регистры для улучшения оптимизировать свой код. Я видел 15% ускорение на идентичном оборудовании.


Как вы заметили, указатели будут больше. В зависимости от архитектуры процессора и может быть ints и/или longs. Строки должны оставаться одинакового размера, но быть выровнены по-разному в памяти для эффективности. Как правило, выравнивание структур данных по 64-битным границам памяти в большинстве случаев приводит к увеличению фрагментации.

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


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

в целом, 64-разрядное приложение, вероятно, будет использовать немного больше памяти, чем 32-битный. Но это не критично.


в зависимости от архитектуры код также может расти. Глобальные переменные и константы часто ссылаются через абсолютные адреса (которые перемещаются загрузчиком программы), эти ссылки 64 бит в 64-битном режиме. На x64 существует явная инструкция mov для 64-битных констант, поэтому программа будет только расти от размера константы. Инструкции перехода и вызова также могут быть больше, но это зависит от многих параметров компилятора и компоновщика. На других архитектурах это может быть даже хуже. На SPARC, например, при переходе от 32 до 64 бит может значительно увеличить код. Поскольку sparc не имеет инструкции, которая может загружать более 22 бит, при загрузке 32-битного адреса глобальной переменной или константы ей нужны 2 инструкции, для загрузки 64-битной константы ей даже нужны 5 инструкций с 3 регистрами. Путем увеличения регистра компилятор часто упускает возможности оптимизации, делая код намного больше, чем необходимо.