【问题标题】:C++ something wrong with this code?C++ 这段代码有问题吗?
【发布时间】:2010-12-31 21:16:37
【问题描述】:

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

【问题讨论】:

  • 你可能需要把 _tmain 放在 GetCpuClocks()...
  • 好吧,伙计们,我发现我需要先声明方法!我唯一的问题是为什么我要使用 int32 来处理这么大的数字?我的一些值是 -xxxxxxxxx 这是否意味着我应该始终使用 64 位数字?
  • nanosecond-level timing 你不会找到的。变数太多了。该函数获取时间非常快,但它不是用来计时的。
  • Falmarri 是对的,如果在您的操作过程中碰巧出现中断,您的时间可能会减少数十甚至数百纳秒。另一方面,您可以收集大量样本并消除异常值,因此获得纳秒级准确计时并非不可能。
  • 如果你想要一些随机的东西,尤其是加密需求,你为什么不使用 CryptoAPI 呢?

标签: c++ windows


【解决方案1】:

在你的主要签名上方签名

__int64 GetCpuClocks();

【讨论】:

    【解决方案2】:

    您需要在数据类型中添加两​​个下划线:__int32

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

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

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

    【讨论】:

      【解决方案3】:

      代码在第 4 行引用了 GetCpuClocks(),但 GetCpuClocks 直到第 7 行才定义。

      【讨论】:

        【解决方案4】:

        更改函数定义的顺序。 GetCpuClocks 应该在 main 调用之前定义或前向声明。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-12
          • 2016-10-23
          • 2013-04-30
          • 2014-05-11
          • 1970-01-01
          • 2015-04-25
          相关资源
          最近更新 更多