2010-12-31 5 views
0

J'essaie d'obtenir un moyen de trouver une sorte de synchronisation au niveau de la nanoseconde pour une méthode de cryptage. J'ai trouvé ce code sur stackoverflow et il ne semble pas compiler dans VS2010 mais je ne peux pas comprendre pourquoi. L'erreur est avec 'time = GetCpuClocks()' et dit "erreur C3861: 'GetCpuClocks': identifiant non trouvé", je ne comprends pas pourquoi? J'avais aussi un problème avec le type 'int32' dans la déclaration de la structure.C++ quelque chose ne va pas avec ce code?

(je suppose que déclarant 'temps' 'long' est ok? Ou devrait-il été __int64?

Merci à l'avance

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    __int64 time; 
    time = GetCpuClocks(); 
} 

inline __int64 GetCpuClocks() {  
    // Counter  
    struct { int32 low, high; } counter;  

    // Use RDTSC instruction to get clocks count  
    __asm push EAX  
    __asm push EDX  
    __asm __emit 0fh 
    __asm __emit 031h 

    // RDTSC  
    __asm mov counter.low, EAX  
    __asm mov counter.high, EDX  
    __asm pop EDX  
    __asm pop EAX  

    // Return result  

    return *(__int64 *)(&counter); 
} 
+0

Vous aurez probablement besoin de mettre _tmain * après * GetCpuClocks() ... – kem

+0

Ok les gars i J'ai découvert que j'avais besoin de déclarer la méthode en premier! Ma seule question est de savoir pourquoi j'utilise int32 pour un si grand nombre. Certaines de mes valeurs sont -xxxxxxxxx cela signifie-t-il que je devrais utiliser des nombres de 64 bits partout? – Jason

+0

'chronométrage niveau nanosecondes' Vous ne trouverez pas cela. Il y a beaucoup trop de variables. Cette fonction obtient le temps vraiment vite, mais ce n'est pas fait pour chronométrer les choses. – Falmarri

Répondre

6

mis une signature au dessus de votre principale

__int64 GetCpuClocks(); 
0

Le code fait référence à GetCpuClocks() dans la ligne 4, mais GetCpuClocks est indéfini jusqu'à la ligne 7.

0

Modifiez l'ordre des définitions de fonction. GetCpuClocks doit être défini ou renvoyé avant l'appel dans main.

2

Vous devez ajouter deux undersocres au type de données: __int32

La raison pour laquelle vous devez utiliser des entiers de 32 bits est parce que les commandes ASM utilisent les registres 32 bits, et donc des entiers 32 bits sont beaucoup plus rapide à copier qu'un seul entier de 64 bits. La conversion dans l'instruction return combine les deux entiers 32 bits dans le résultat final 64 bits avec peu ou pas de temps supplémentaire. La raison d'utiliser __int32 et __int64 au lieu de int et long est parce que __int32/64 ont des tailles universellement définies, alors que short, int et long ont techniquement des tailles variables en fonction du compilateur et de l'architecture de la plate-forme.

(Bien sûr, vous savez déjà sur le fait que les fonctions doivent être déclarées dans l'ordre inverse.)

Questions connexes