Сколько использование памяти, вероятно, вырастит при перемещении в 64 бита?

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

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

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

7
задан Peter Gibson 17 July 2010 в 13:08
поделиться

4 ответа

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

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

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

7
ответ дан 6 December 2019 в 15:18
поделиться

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

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

3
ответ дан 6 December 2019 в 15:18
поделиться

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

2
ответ дан 6 December 2019 в 15:18
поделиться

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

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

2
ответ дан 6 December 2019 в 15:18
поделиться