El boxeo convierte un tipo de valor en un tipo de objeto. O como dice MSDN, el boxeo es una "operación para envolver la estructura dentro de un objeto de tipo de referencia en el montón administrado".C# - ¿Es posible agrupar cajas?
Pero si intenta profundizar en eso mirando el código IL, solo verá la palabra mágica "caja". clase secreta
Especular, supongo que el tiempo de ejecución tiene algún tipo de medicamentos genéricos basado en la manga, como Box<T>
con una propiedad public T Value
, y el boxeo un int se vería así:
int i = 5;
Box<int> box = new Box<int>;
box.Value = 5;
Unboxing del int haría sea mucho más barato: return box.Value;
Por desgracia, mi aplicación de servidor de rendimiento hambre hace un poco de boxeo, en concreto de decimales. Peor aún, estas cajas son de corta duración, lo que me hace sospechar que pagué dos veces, una para la instanciación de la caja y otra para la basura que recoge la caja una vez que he terminado con ella.
Si estuviera alojando esta memoria yo mismo, consideraría el uso de un conjunto de objetos aquí. Pero dado que la creación del objeto real está oculta detrás de una palabra mágica en el IL, ¿cuáles son mis opciones?
Mis preguntas específicas:
- ¿Existe un mecanismo existente para inducir el tiempo de ejecución para llevar cajas de una piscina en lugar de instanciando ellos?
- ¿Cuál es el tipo de instancia creada durante el boxeo? ¿Es posible tomar el control del proceso de boxeo de forma manual, y aún así ser compatible con el desempaquetado?
Si esta última pregunta parece extraño, lo que quiero decir es que podía crear mi propia Box<T>
o DecimalBox
clase, la piscina, y la caja/unbox manualmente. Pero no quiero tener que ir y modificar los diversos lugares en el código que consumen el valor en caja (también conocido como unbox it).
¿Ha considerado reducir las operaciones de boxeo utilizando genéricos/objetos personalizados/etc.? La instrucción 'box' es intencionalmente opaca, aunque puedes, por supuesto, imitarla a través de tu clase' Box 'anterior. –
dlev
"mi aplicación hace un poco de boxeo". Un juego extraño, el único movimiento ganador es no jugar. –
"Peor aún, estas cajas son de corta duración, lo que me hace sospechar que pago dos veces, una para la instanciación de la caja y luego otra para la basura que recoge la caja después de que haya terminado con ella". Usted perfiló eso, ¿verdad? es decir, usted sabe que el GC es un cuello de botella en su aplicación porque lo midió, y no porque lo haya adivinado. La única vez que conseguí unirme a GC fue asignar con frecuencia matrices de bytes grandes. Si las colecciones Gen0 son un cuello de botella, debería reconsiderar su diseño. – CodesInChaos