std::atomic
store
和load
接受参数等std::memory_order
函数。参数可以在运行时确定,就像任何其他函数参数一样。但是,实际值可能会影响编译期间代码的优化。考虑以下:
std::atomic<int> ai1, ai2;
int value = whatever;
void foo() {
std::memory_order memOrd = getMemoryOrder();
register int v = value; // load value from memory
ai1.store(v, memOrd); // dependency on v's value
ai2.store(1, memOrd); // no dependency. could this be move up?
}
如果memOrd
碰巧memory_order_relaxed
,第二家商店可以安全地移到第一家之前。这将在加载value
和使用它之间增加一些额外的工作,这可能会防止其他需要的停顿。但是,如果memOrd
是memory_order_seq_cst
,则不应允许切换存储,因为某些其他线程可能会依赖ai1
已设置为value
ifai2
设置为 1。
我想知道为什么将内存顺序定义为运行时参数而不是编译时间。在决定最佳内存操作语义之前,是否有任何理由让某人在运行时检查环境?