2017-05-08 1 views
-2

J'ai plusieurs tableaux de longueur fixe et je veux les comparer.Est-il possible de comparer la mémoire brute en C++?

struct Foo 
{ 
    /// the data, not necessarily int and not necessarily length 32 
    int val[32]; 

    /// simple way 
    inline bool compare1(const NAME_CELL & rhs) const 
    { 
     for (unsigned int ui = 0; ui < 32; ++ui) 
     { 
      if (val[ui] != rhs.val[ui]) 
      { 
       return false; 
      } 
     } 
     return true; 
    } 

    /// compare memory directly instead of using a loop. Is this faster? 
    inline bool compare2(const NAME_CELL & rhs) const 
    { 
     return memcmp(val, rhs.val, 32 * sizeof(int)) == 0; 
    } 
}; 

Est-ce que compare1 est plus lent, plus rapide ou égal à compare2? Y a-t-il un moyen encore plus rapide?

+0

Je suppose que vous voulez dire 'memcmp'? –

+0

En outre, votre titre dit "C" mais vous avez marqué ce "C++" - de quoi parlez-vous? –

+0

Merci, corrigé le titre. J'utilise C++ bien que ma question puisse être tout aussi pertinente pour les développeurs C. – Fabian

Répondre

2

Sauf si vous avez initialisés les éléments de val alors le comportement de ou l'autre méthode est non défini dans la norme C++. Mis à part cela, il vaut mieux faire confiance au compilateur pour effectuer les optimisations appropriées. Mais si vous avez encore des doutes, (i) profilez la performance, (ii) vérifiez l'assemblage généré, & c.

+0

Ré initialisation: pourquoi le comportement est-il indéfini? Le contenu de val serait, mais le comportement? – James

+1

'int' pourrait contenir une représentation d'interruption. Un tableau 'unsigned char' serait bien. Voir http://stackoverflow.com/questions/11962457/why-is-using-an-uninitialized-variable-undefined-behavior-in-c. Certes, il est étiqueté C, mais un bon point de départ. – Bathsheba

+0

Bien sûr, vous devez initialiser les Foos avant de les comparer. Pas besoin de le mentionner. – Fabian