C 更喜欢获取和添加还是添加和获取?

C 更喜欢获取和添加还是添加和获取?,c,atomic,C,Atomic,我正在使用增加共享的volatile int。我所要做的就是增加值,我不关心返回值。我应该选择fetch\u and\u add还是add\u and\u fetch?我在文档中没有看到任何东西表明其中一个会比另一个有性能优势。真的没关系吗 或者,由于我实际上不需要以原子方式读取值,是否有更好的方法来增加volatile int,因为我实际上不读取返回值 这显然取决于体系结构,因此您可以假设我使用的是x64。如果有区别的话,我特别使用AMD Opteron CPU。这取决于硬件、变量大小、增量值

我正在使用增加共享的
volatile int
。我所要做的就是增加值,我不关心返回值。我应该选择
fetch\u and\u add
还是
add\u and\u fetch
?我在文档中没有看到任何东西表明其中一个会比另一个有性能优势。真的没关系吗

或者,由于我实际上不需要以原子方式读取值,是否有更好的方法来增加
volatile int
,因为我实际上不读取返回值


这显然取决于体系结构,因此您可以假设我使用的是x64。如果有区别的话,我特别使用AMD Opteron CPU。

这取决于硬件、变量大小、增量值和编译器选项

为了检查它,将一个小C程序翻译成汇编

volatile int init;
void foo(void) {
    __sync_fetch_and_add(&init,1);
    __sync_add_and_fetch(&init,1);
}
将“gcc-sx.c”转换为文件x.S。 x.s中最有趣的是

    lock addl       $1, init(%rip)
    lock addl       $1, init(%rip)
这表明这两个内部函数被转换为相同的汇编代码(在Intel x64上)


您也可以尝试使用-march=native和/或-O3或您最喜欢的选项,看看它是否总是一样的…

这只是一种预感,但可能取决于硬件。。。测量一下。@KarolyHorvath-是的,这是真的。我更新了这个问题,以便更清楚地表明我使用的是相当标准的x64系统。