我正在使用GCC's atomic builtins来增加共享volatile int
。我想要做的就是增加值,而不关心返回值。我应该更喜欢fetch_and_add
还是add_and_fetch
?我没有看到文档中的任何内容表明一个人会比另一个人有性能上的好处。这真的没关系吗?
或者,因为我实际上不需要原子地读取值,是否有更好的方法来增加volatile int
,因为我实际上没有读取返回值?
这显然取决于架构,因此您可以假设我使用的是x64。我特意使用AMD Opteron CPU,如果这有所作为的话。
答案 0 :(得分:2)
这取决于您的硬件,取决于变量的大小,增量值和编译器选项。
要检查它,请将一个小C程序转换为汇编。
volatile int init;
void foo(void) {
__sync_fetch_and_add(&init,1);
__sync_add_and_fetch(&init,1);
}
将'gcc -S x.c'翻译成文件x.s. x.s中最有趣的是
lock addl $1, init(%rip)
lock addl $1, init(%rip)
这表明两个内在函数被转换为相同的汇编代码(在Intel x64上)。
您也可以尝试使用-march = native和/或-O3或您最喜欢的选项来查看它是否始终相同...