es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

En C#, ¿cómo puedo reinterpretar byte[] como T[], donde T es una estructura?

Estoy usando C# (.NET 5). Imagina que tengo una clase que almacena un arreglo de estructuras (por ejemplo, floats):

public class AlmacenaArreglo
{
    private float[] flotantes;
}

Los datos de esta clase se cargan desde un archivo binario serializado. Para asignar el arreglo de floats, utilizo una función auxiliar para leer bytes del archivo serializado. Es importante destacar que esta función intenta reinterpretar los bytes cargados directamente como float[] en lugar de copiarlos a un nuevo arreglo.

public static class Deserializador
{
    public static float[] Cargar(string archivo)
    {
        byte[] bytes = CargarBytesDesdeArchivo(archivo);

        // Esto es un error de compilador, por supuesto.
        return (float[])bytes;
    }
}

El uso previsto es el siguiente:

// Dentro de la clase AlmacenaArreglo...
flotantes = Deserializador.Cargar("MiArchivo.archivo");

Cabe destacar que estoy intentando almacenar el float[] como una variable miembro, no solo iterar sobre el byte[] de forma local. Por lo tanto, la conversión a través de Span<t> (Span<float> floatSpan = MemoryMarshal.Cast<byte, float="">(bytes.AsSpan())) no es suficiente. Las funciones asociadas con Memory<t>, Marshal y MemoryMarshal también han fallado de manera similar. Por supuesto, podría usar spans (junto con otros métodos, como BitConverter o punteros no seguros) para construir un nuevo float[] a partir del byte[], pero eso incurriría en una asignación de arreglo adicional, así como operaciones adicionales para convertir los bytes. En el contexto en el que estoy preguntando (cargando activos de videojuegos sobre la marcha), me gustaría optimizar el rendimiento tanto como sea posible.

¿Es posible en el C# moderno reinterpretar y almacenar arreglos de structs sin incurrir en una asignación adicional?</byte,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no es posible reinterpretar y almacenar matrices de estructuras sin incurrir en una asignación adicional en C# moderno. Esto se debe a que C# impone la seguridad de tipos y el intento de convertir directamente una matriz de bytes en una matriz de floats resultará en un error del compilador. Si bien existen diversos métodos (como el uso de spans, BitConverter o punteros inseguros) para construir una nueva matriz de floats a partir de la matriz de bytes, todos requieren una asignación adicional y/o operaciones adicionales para realizar la conversión. Por lo tanto, para obtener un rendimiento óptimo, puede ser necesario considerar otros enfoques, como asignar previamente un conjunto de matrices o utilizar archivos de mapeo de memoria.

Comments are closed.