При перемещении приложения от 32 битов до 64 битов, где увеличенное использование памяти произойдет?
Я понимаю, что указатели удвоятся в размере, я подозреваю, что символы в строке 'сгруппированы' для использования памяти более эффективно (так не будет использовать намного больше памяти).
Где еще использование памяти увеличилось бы? Есть ли где-нибудь, что это уменьшилось бы, или где неарифметические операции будут видеть, что скорость извлекает выгоду?
Вы можете увидеть дополнительное выравнивание, которое требует дополнительных байтов здесь и там. Код, вероятно, будет больше из-за 64-битных констант в операндах.
Что касается скорости, то из-за увеличения использования памяти может наблюдаться ее снижение. Кэш ЦП будет заполняться быстрее.
Я видел значительное увеличение скорости перехода от x86 к x64, потому что x86 имеет гораздо меньше регистров, чем архитектура x64. Компиляторы используют дополнительные регистры для лучшей оптимизации вашего кода. Я видел 15% ускорение на идентичном оборудовании.
Как вы отметили, указатели будут больше. В зависимости от архитектуры процессора это может быть также ints
и / или longs
. Строки должны оставаться одного и того же размера, но для повышения эффективности выравниваться в памяти по-разному. Как правило, выравнивание памяти структур данных по 64-битным границам в большинстве случаев вызывает повышенную фрагментацию.
Кроме того, адресное пространство вашего процесса может казаться (во многих архитектурах) намного большим, поскольку указатели кадров стека появляются в верхней памяти (и растут вниз), но поскольку они неизменно являются указателями виртуальной памяти, фактическая физическая память, используемая вашим приложением, является обычно значительно меньше.
В зависимости от архитектуры код также может расти. К глобальным переменным и константам часто обращаются через абсолютные адреса (которые перемещаются загрузчиком программы), эти ссылки являются 64-битными в 64-битном режиме. В x64 есть явная инструкция mov для 64-битных констант, поэтому программа будет только увеличивать размер константы. Инструкции перехода и вызова также могут увеличиваться, но это зависит от множества параметров компилятора и компоновщика. На других архитектурах может быть даже хуже. Например, на SPARC переход с 32 на 64 бит может привести к значительному увеличению кода. Поскольку у sparc нет инструкции, которая может загружать более 22 бит, при загрузке 32-битного адреса глобальной переменной или константы ему нужны 2 инструкции, для загрузки 64-битной константы ему даже нужны 5 инструкций с 3 регистрами. Увеличивая давление на регистры, компилятор часто упускает возможности оптимизации, делая код намного больше, чем необходимо.
Есть несколько случаев, когда вы можете сэкономить память. Фактический код местами может быть немного короче, поскольку из-за увеличения числа регистров требуется меньше загрузки/сохранения. Например, в стандартном соглашении о вызове параметры передаются в регистрах.
В целом, 64-битное приложение, вероятно, будет использовать немного больше памяти, чем 32-битное. Но это не будет решающим фактором.