我正试图找到一种方法来为加密方法找到某种纳秒级时序。我在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);
}
答案 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。