Насколько вероятно увеличение использования памяти при переходе на 64-битную версию? - PullRequest
7 голосов
/ 17 июля 2010

При перемещении приложения из 32-разрядного в 64-разрядное место будет происходить повышенное использование памяти?

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

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

Ответы [ 4 ]

7 голосов
/ 17 июля 2010

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

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

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

3 голосов
/ 17 июля 2010

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

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

2 голосов
/ 17 июля 2010

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

2 голосов
/ 17 июля 2010

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

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

...