Pregunta

Buenos días, tarde o noche,

Prefacio: El siguiente código no hace nada realmente útil.Es sólo para fines explicativos.

¿Hay algún problema con la asignación y el uso de una matriz en "modo seguro" dentro de un código inseguro?Por ejemplo, ¿debería escribir mi código como

public static unsafe uint[] Test (uint[] firstParam, uint[] secondParam)
{
    fixed (uint * first = firstParam, second = secondParam)
    {
        uint[] Result = new uint[firstParam.Length + secondParam.Length];

        for (int IndTmp = 0; IndTmp < firstParam.Length; Result[IndTmp] = *(first + IndTmp++));
        for (int IndTmp = 0; IndTmp < secondParam.Length; Result[IndTmp + firstParam.Length] = *(second + IndTmp++);

        return Result;
    }
}

¿O debería escribir un método separado e inseguro que acepte solo punteros y longitudes como parámetros y usarlo en la función principal?

Además, ¿hay alguna forma de reemplazar la asignación con

uint * Result = stackalloc uint[firstParam.Length + secondParam.Length]

para que pueda usar Result como puntero y aún poder regresar Result como un uint[]?

Muchas gracias.

¿Fue útil?

Solución

No veo nada malo en hacer eso, aunque si estás usando punteros para velocidad, probablemente tenga sentido usar un puntero en Result también.Tal vez así:

public static unsafe uint[] Test (uint[] firstParam, uint[] secondParam)
{
    uint[] Result = new uint[firstParam.Length + secondParam.Length];
    fixed (uint * first = firstParam, second = secondParam, res = Result)
    {
        for (int IndTmp = 0; IndTmp < firstParam.Length; IndTmp++)
            *(res + IndTmp) = *(first + IndTmp);
        res += firstParam.Length;
        for (int IndTmp = 0; IndTmp < secondParam.Length; IndTmp++)
            *(res + IndTmp) = *(second + IndTmp++);
    }
    return Result;
}

NO devolver cualquier cosa que stackalloc!Una vez que la función regresa, el área asignada en la pila se reutiliza, lo que genera un puntero no válido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top