sharp - que significa c#
sizeof() equivalente para los tipos de referencia? (6)
Necesita Marshal.SizeOf
Editar: Esto es para código inseguro, pero también lo es sizeof ().
Estoy buscando una manera de obtener el tamaño de una instancia de un tipo de referencia. sizeof es solo para tipos de valores. es posible?
Por favor refiérase a mi respuesta en el siguiente enlace.
Es posible a través de la extensión del depurador .sos.dll
Recientemente tuve una pregunta similar y quería saber el tamaño de Object y LinkedListNode en C #. Para resolver el problema, desarrollé un programa que:
- Mida el "Conjunto de trabajo" del programa
- Asigna muchos objetos.
- Mida el "Conjunto de trabajo" nuevamente.
- Divida la diferencia entre el número de objetos asignados.
En mi computadora (64 bits), obtuve la siguiente información:
Measuring Object:
iter working set size estimate
-1 11190272
1000000 85995520 74.805248
2000000 159186944 73.998336
3000000 231473152 73.4276266666667
4000000 306401280 73.802752
5000000 379092992 73.580544
6000000 451387392 73.3661866666667
7000000 524378112 73.3125485714286
8000000 600096768 73.613312
9000000 676405248 73.9127751111111
Average size: 73.7577032239859
Measuring LinkedListNode<Object>:
iter working set size estimate
-1 34168832
1000000 147959808 113.790976
2000000 268963840 117.397504
3000000 387796992 117.876053333333
4000000 507973632 118.4512
5000000 628379648 118.8421632
6000000 748834816 119.110997333333
7000000 869265408 119.299510857143
8000000 993509376 119.917568
9000000 1114038272 119.985493333333
Average size: 118.296829561905
Estimated Object size: 29.218576886067
Estimated LinkedListNode<reference type> size: 44.5391263379189
Según los datos, el tamaño promedio de la asignación de millones de objetos es de aproximadamente 29,2 bytes. Un objeto LinkedListNode tiene aproximadamente 44.5 bytes. Esta información ilustra dos cosas:
- Es muy poco probable que el sistema esté asignando un byte parcial. La medida fraccionaria de bytes indica la sobrecarga que el CLR requiere para asignar y rastrear millones de tipos de referencia.
- Si simplemente redondeamos el número de bytes, todavía es poco probable que tengamos el recuento de bytes adecuado para los tipos de referencia. Esto está claro desde la medida de los Objetos. Si redondeamos hacia abajo, suponemos que el tamaño es de 29 bytes, lo que, aunque es teóricamente posible, es poco probable debido al relleno. Para mejorar el rendimiento, las asignaciones de objetos suelen rellenarse para fines de alineación. Supongo que los objetos CLR estarán alineados a 4 bytes.
Suponiendo una sobrecarga de CLR y una alineación de 4 bytes, estimaría que un objeto en C # tiene 28 bytes y LinkedListNode tiene 44 bytes.
Por cierto, Jon Skeet tuvo la idea del método anterior antes que yo y lo expresó en esta respuesta a una pregunta similar.
Si no te importa que sea un poco menos preciso que perfecto, y para fines comparativos, puedes serializar los objetos y medirlos (en bytes, por ejemplo)
EDITAR (seguí pensando después de publicar) : porque es un poco más complicado que el tamaño de los tipos de valores, por ejemplo: los tipos de referencia pueden tener referencias a otros objetos y así sucesivamente ... no hay una manera exacta y fácil de hacerlo que yo sepa de...
Si puedes: ¡serializarlo!
Dim myObjectSize As Long
Dim ms As New IO.MemoryStream
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter()
bf.Serialize(ms, myObject)
myObjectSize = ms.Position
Ten en cuenta que Marshal.SizeOf es para código inseguro ...
No creo que sea posible para el código administrado, tal vez puedas explicar tu problema, puede haber otra forma de resolverlo