我使用GCC原子结构来增加共享的volatile int。我所要做的就是增加这个值,而且我不关心返回值。为此,我应该选择fetch_and_add还是add_and_fetch?我在文档中没有看到任何东西表明其中一个会比另一个有性能上的好处。真的不重要吗?
或者,由于我实际上不需要原子地读取值,那么是否有更好的方法来增加volatile int,因为我实际上并不读取返回值?
这显然是依赖于体系结构的,所以您可以假设我使用的是x64。我是专门使用AMD Opteron CPU,如果这有区别。
发布于 2013-09-02 09:17:30
它取决于硬件,取决于变量的大小、增量值和编译器选项。
要检查它,请将一个小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或您最喜欢的选项尝试它,以确定它是否总是相同的.
https://stackoverflow.com/questions/18011044
复制相似问题