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系统。