2010-12-31 10 views
0

私は、暗号化方法のための何らかの種類のナノ秒レベルのタイミングを見つける方法を得ようとしています。私はstackoverflow上でこのコードを発見し、それはVS2010でコンパイルするように見えるが、私は理由を把握できない。エラーは 'time = GetCpuClocks()'で、「エラーC3861: 'GetCpuClocks':識別子が見つかりません」というメッセージが表示されます。私はstruct宣言の 'int32'型にも問題がありました。C++にこのコードが間違っていますか?

は(私は '長い' と '時間' を宣言すると推定okです?それとも、__int64されている必要があります?

事前に感謝

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

あなたはおそらく* GetCpuClocks(後* _tmain置く必要があります)... – kem

+0

[OK]をみんな私が私はまずメソッドを宣言する必要があることを知った!私の唯一のqyestionなぜそのような大きな数のint32を使用しているのですか?私の価値観の中には、-xxxxxxxxxというものがあります。これは、全体を通して64ビットの数字を使うべきであるという意味ですか? – Jason

+0

'nanosecond-level timing'あなたはそれを見つけられません。あまりにも多くの変数があります。その関数は本当に速い時間を得ますが、時間を計るためのものではありません。 – Falmarri

答えて

6

があなたのメイン

__int64 GetCpuClocks(); 
ABOVE署名を置きます
0

コードは4行目のGetCpuClocks()を参照していますが、GetCpuClocksは7行目までは未定義です。

0

関数定義の順序を変更します。 GetCpuClocksはmainの呼び出しの前に宣言または定義されるべきです。

2

あなたはデータ型に2 undersocresを追加する必要があります。ASMコマンドは、32ビット・レジスタを使用しているので、32ビット整数がずっとあるので、あなたが32ビット整数を使用する必要が__INT32

理由があります1つの64ビット整数より高速にコピーできます。 return文のキャストは、2つの32ビット整数を余分な時間を費やすことなく、最後の64ビットの結果に結合します。

intとlongの代わりに__int32と__int64を使用するのは、__int32/64が汎用的にサイズを設定しているのに対し、short、int、およびlongは技術的にはコンパイラとプラットフォームのアーキテクチャによって可変サイズです。

(もちろん、あなたはすでに機能が逆の順序で宣言する必要があるという事実を知っている。)