C ++这个代码有问题吗?

时间:2010-12-31 21:16:37

标签: c++ windows

我正试图找到一种方法来为加密方法找到某种纳秒级时序。我在stackoverflow上找到了这个代码,它似乎没有在VS2010中编译,但我无法弄清楚为什么。错误是'time = GetCpuClocks()'并说“错误C3861:'GetCpuClocks':标识符未找到”,我不明白为什么?我在结构声明中也遇到了'int32'类型的问题。

(我假设'时间'是'长'可以吗?或者它应该是__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);  
}

4 个答案:

答案 0 :(得分:6)

将签名放在你的主要

上面
__int64 GetCpuClocks();

答案 1 :(得分:2)

您需要在数据类型中添加两​​个undersocres:__ int32

您需要使用32位整数的原因是因为ASM命令使用的是32位寄存器,因此32位整数的复制速度比单个64位整数快得多。 return语句中的强制转换将两个32位整数组合成最终的64位结果,几乎没有花费额外的时间。

使用__int32和__int64而不是int和long的原因是因为__int32 / 64具有通用设置大小,而short,int和long在技术上具有可变大小,具体取决于编译器和平台体系结构。

(当然,你已经知道函数需要以相反的顺序声明。)

答案 2 :(得分:0)

代码引用第4行中的GetCpuClocks(),但GetCpuClocks未定义,直到第7行。

答案 3 :(得分:0)

更改功能定义的顺序。应该在main中调用之前定义或转发GetCpuClocks。