Indexação segura dentro do código inseguro
-
28-10-2019 - |
Pergunta
Bom dia, tarde ou noite,
Prefácio: o código a seguir não faz nada de realmente útil.É apenas para fins de explicação.
Há algo de errado em alocar e usar um array "o modo seguro" dentro do código inseguro?Por exemplo, devo escrever meu 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;
}
}
ou, em vez disso, devo escrever um método separado e inseguro, aceitando apenas ponteiros e comprimentos como parâmetros e usá-lo na função principal?
Além disso, há alguma maneira de substituir a alocação por
uint * Result = stackalloc uint[firstParam.Length + secondParam.Length]
para que eu possa usar Result
como um ponteiro e ainda ser capaz de retornar Result
como um uint[]
?
Muito obrigado.
Solução
Não vejo nada de errado em fazer isso, embora se você estiver usando ponteiros para velocidade, provavelmente faça sentido usar um ponteiro em Result
também.Talvez assim:
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;
}
NÃO retorne nada que você stackalloc
!Assim que a função retorna, a área alocada na pilha é reutilizada, fornecendo a você um ponteiro inválido.