Indexación segura dentro de código inseguro
-
28-10-2019 - |
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.
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.