Indexation sûre à l'intérieur du code dangereux
-
28-10-2019 - |
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.
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.