【问题标题】:_InterlockedIncrement intrinsic implementation_InterlockedIncrement 内部实现
【发布时间】:2012-07-08 15:15:07
【问题描述】:

当使用_InterlockedIncrement 时,Visual Studio 会生成以下机器代码:

; 40   :        _InterlockedIncrement(&framecounter);

  00078 b8 00 00 00 00   mov     eax, OFFSET ?framecounter@@3JA ; framecounter
  0007d b9 01 00 00 00   mov     ecx, 1
  00082 f0 0f c1 08  lock     xadd   DWORD PTR [eax], ecx

如果我要写这篇文章,我会使用 lock inc DWORD PTR [eax] 而不是 movxadd

Microsoft 首选 xadd 并使用 2 条指令而不是 1 条指令是否有正当理由?

【问题讨论】:

    标签: visual-studio-2010 assembly x86 intrinsics


    【解决方案1】:

    因为_InterlockedIncrement 也返回新值。

    lock inc DWORD PTR [eax] 无法做到这一点,因为现在无论是旧值还是新值都找不到。除了在内存中,但如果你进行其他读取,显然它不会是原子的(增量本身是,但你可以得到一个与增量时发生的事情无关的值)。

    返回值使_InterlockedIncrement 更有用。

    【讨论】:

    • 你是对的......现在在我已经编写的代码中添加了更多代码之后,当我将“帧计数器”与其他东西进行比较时,我对我的公司有一种令人毛骨悚然的感觉 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 2019-05-17
    • 2017-07-06
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    相关资源
    最近更新 更多