Question

Bonjour, après-midi ou nuit,

Avant-propos: Le code ci-dessous ne fait rien de vraiment utile. C'est juste à des fins d'explication.

Y a-t-il quelque chose de mal à allouer et à utiliser un tableau "le mode sûr" dans le code dangereux? Par exemple, devrais-je écrire mon code comme

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 dois-je plutôt écrire une méthode distincte et dangereuse n'acceptant que les pointeurs et les longueurs comme paramètres et l'utiliser dans la fonction principale?

De plus, y a-t-il un moyen de remplacer l'allocation par

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

pour que je puisse utiliser Result En tant que pointeur et toujours pouvoir revenir Result en tant que uint[]?

Merci beaucoup.

Était-ce utile?

La solution

Je ne vois rien de mal à faire cela, bien que si vous utilisez des pointeurs pour la vitesse, il est probablement logique d'utiliser un pointeur dans Result aussi. Peut-être comme ça:

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;
}

NE PAS Renvoyez tout ce que vous stackalloc! Une fois que la fonction retourne, la zone allouée sur la pile est réutilisée, vous donnant un pointeur non valide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top