Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2010 _联锁增量内在实现_Visual Studio 2010_Assembly_X86_Intrinsics - Fatal编程技术网

Visual studio 2010 _联锁增量内在实现

Visual studio 2010 _联锁增量内在实现,visual-studio-2010,assembly,x86,intrinsics,Visual Studio 2010,Assembly,X86,Intrinsics,当使用\u 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

当使用
\u 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]
而不是
mov
xadd


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

因为
\u InterlockedIncrement
也会返回新值

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


返回值会使联锁增量更有用。

你说得对。。。现在,在我已经编写的代码中添加了更多的代码之后,当我将“framecounter”与Cometing else进行比较时,我对我的inc有一种令人毛骨悚然的感觉:)