¿Cuál es la sobrecarga de uso de memoria para una aplicación de 64 bits?


De lo que he encontrado hasta ahora, está claro que los programas compilados para una arquitectura de 64 bits usan el doble de RAM para punteros que sus alternativas de 32 bits- https://superuser.com/questions/56540/32-bit-vs-64-bit-systems .

¿Significa eso que el código compilado para 64 bits utiliza en promedio dos veces más RAM que la versión de 32 bits?

De alguna manera lo dudo, pero me pregunto cuál es la sobrecarga real. Supongo que los tipos pequeños, como short, byte y char ¿tienen el mismo tamaño en una arquitectura de 64 bits? Sin embargo, no estoy muy seguro de byte. Dado que muchas aplicaciones funcionan con cadenas grandes(como navegadores web, etc.), que consisten principalmente en char arrays en la mayoría de las implementaciones, la sobrecarga puede no ser tan grande.

Entonces, incluso si los tipos numéricos como int y long son más grandes en 64 bits, ¿tendría un efecto significativo en el uso de RAM o no?

Author: Community, 2015-03-19

3 answers

Depende del estilo de programación (y del lenguaje, pero se refiere a C).

  • Si trabajas mucho con punteros (o tienes muchas referencias en algunos idiomas), el consumo de RAM aumenta.
  • Si utiliza muchos datos con tamaño fijo, como double o int32_t, el consumo de RAM no aumenta.
  • Para tipos como int o long, depende de la arquitectura; puede haber diferencias entre Linux y Windows. Aquí usted ve el alternativas que tienes. En resumen, Windows usa LLP64, lo que significa que long long y los punteros son de 64 bits, mientras que Linux usa LP64, donde longtambién es de 64 bits. Otras arquitecturas podrían hacer int o incluso short 64 bits también, pero estos son bastante poco comunes.
  • float y double deben permanecer iguales en tamaño en todos los casos.

Así que verá que depende en gran medida del uso de los tipos de datos.

 42
Author: glglgl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-19 20:04:58

Hay algunas razones para que el consumo de memoria aumente. Sin embargo, la sobrecarga de 64b vs 32b depende de una aplicación a otra.

  • La razón principal es usando muchos punteros en su código. Sin embargo, un array asignado dinámicamente en un código compilado para 64 bits y en ejecución en un sistema operativo de 64 bits sería del mismo tamaño que la matriz asignada en un 32 sistema de bits. Solo la dirección de la matriz será más grande, el contenido el tamaño será el mismo ( excepto cuando el tamaño del tipo cambiado - sin embargo eso no debería suceder y debería estar bien documentado).

  • Otro aumento de huella se debe a la alineación de memoria . En modo de 64 bits la alineación debe considerar una dirección de 64 bits para que debería agregar una pequeña sobrecarga.

  • Probablemente el tamaño del código aumentará. En algunos arquitecturas la ISA de 64 bits podría ser un poco más grande. Además, lo haría ahora tienes que hacer llamadas a direcciones de 64 bits.

  • Cuando ejecutar en registros de 64 bits es mayor (64 bits), por lo que si usa muchos tipos numéricos el compilador también podría colocarlos en registros por lo que no necesariamente debe significar que su huella de RAM subiría. El uso de variables dobles es probable que produzca una memoria la huella aumenta si no se almacenan en registros 64b.

  • Cuando se utilizan lenguajes compilados JIT como Java,. NET es probable que el aumento de la huella de código 64b sería mayor como el el entorno de tiempo de ejecución generará sobrecarga adicional a través del uso de puntero, estructuras de control ocultas, etc.

Sin embargo, no hay un número mágico que describa la sobrecarga de la huella de memoria de 64 bits. Eso necesita ser medido de una aplicación a otra. Por lo que he visto, Nunca obtuve más del 20% de aumento en la huella para una aplicación que se ejecuta en 64 bits, en comparación con 32 bits. Sin embargo, eso se basa puramente en las aplicaciones que encontré y estoy usando principalmente C y C++.

 24
Author: VAndrei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-31 08:00:43

Creo que puede haber otra razón que se remonta en que las variables necesitan ser almacenados en la memoria en un límite de 64 bits en una dirección que es ...xxxxx000 para ser leído en un bocado, si no lo es necesita leerlo en un byte a la vez.

 0
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-25 10:53:33