2011-03-23 1 views
0

Bonjour, après-midi ou la nuit,indexation sécurité à l'intérieur code unsafe

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

Y a-t-il quelque chose qui cloche dans l'allocation et l'utilisation d'un tableau "le mode sans échec" dans un code dangereux? Par exemple, dois-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 devrais-je écrire à la place une méthode distincte, peu sûr d'accepter uniquement des pointeurs et des longueurs en tant que paramètres et l'utiliser dans la fonction principale?

Aussi, est-il possible que je peux remplacer l'allocation par

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

pour que je puisse utiliser Result comme pointeur et être encore capable de revenir Result comme uint[]?

Merci beaucoup.

Répondre

2

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

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 quoi que ce soit de retour, vous stackalloc! Une fois la fonction renvoyée, la zone allouée sur la pile est réutilisée, ce qui vous donne un pointeur invalide.