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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top