valor - c#variable de referencia asignación de mem
variables c# (5)
Dependiendo de si está en una máquina de 32 o 64 bits, será un puntero de 32 o 64 bits.
¿Alguien sabe cuánta memoria se toma cuando se crea una variable de tipo de referencia?
String s = "123";
¿Cuánta memoria tomará como referencia, no los datos que la señalan?
El tamaño de la referencia en sí dependerá de la arquitectura de su procesador: 4 bytes en 32 bits, 8 bytes en 64 bits.
Se necesitan 4 bytes Typicall para la referencia
Si desea verificar esto en el código, llame a:
IntPtr.Size
Esto se desglosa de la siguiente manera:
String s = "123";
La variable s: esto consumirá el tamaño del puntero nativo en la arquitectura actual (que se considera de 32 bits si el sistema operativo es de 32 bits o el proceso se está ejecutando bajo WoW64), por lo que 32 bits o 64 bits en consecuencia. En este caso, s está en la pila o está registrado. Si colocara la referencia de cadena en una matriz, ese espacio se consumiría en el montón.
El hecho de que la cadena es un objeto: 8 bytes de división aérea 4 bytes para la tabla de métodos, que funciona como la indicación de qué tipo real es un objeto más 4 bytes para algunos bits de mantenimiento y el bloque de sincronización que permite su uso como el objetivo de una declaración de bloqueo.
La cadena siempre termina con el carácter nulo (aunque se trata de un detalle de implementación que no forma parte del contrato del tiempo de ejecución), de modo que se puede usar directamente con apis de cadena C-Style, los caracteres son UTF-16, por lo que dos bytes por carácter el sentido .Net usa el carácter (los detalles de por qué es complicado y requiere una transición a Unicode, omitiré).
Las cadenas contienen además lo siguiente:
Versiones de .Net antes de 4.0
- una int para la longitud de la cadena en caracteres
- un int para la longitud de la matriz subyacente que contiene los caracteres
- un personaje que es el primer personaje de la cadena (los personajes posteriores están directamente detrás de él) o el carácter nulo de una cadena vacía
La cadena puede consumir hasta el doble de la cantidad de memoria requerida para mantener realmente la matriz de caracteres necesaria para la forma en que funciona StringBuilder
Por lo tanto, la cadena en sí consumirá entre 16 + (2 * n) + 2 y 16 + (4 * n) + 2 bytes en el montón dependiendo de cómo se creó.
Versiones de .Net desde 4.0 en adelante
- un int para la longitud de la cadena en caracteres
- un personaje que es el primer personaje de la cadena (los personajes posteriores están directamente detrás de él) o el carácter nulo de una cadena vacía
La cadena en sí consumirá al menos 12 + (2 * n) + 2 bytes en el montón.
Tenga en cuenta que en ambos casos, la cadena puede ocupar un poco más de espacio real de lo que usa dependiendo de la alineación que aplique el tiempo de ejecución, es probable que no sea más que IntPtr.Size.
Esto puede complicarse aún más con el interrogatorio de cadenas (donde dos instancias separadas terminan apuntando a la misma cadena ya que es inmutable) ya que en teoría debería dividir la sobrecarga del montón (más la sobrecarga interna) por el número de referencias "independientes" al cuerda.
para más discusión sobre esto, eche un vistazo a este artículo . Sin embargo, tenga en cuenta que este artículo no está actualizado para los cambios en 4.0.