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 value
ai2.store(1, memOrd); // no dependency. could this be move up?
}
Если memOrd оказывается memory_order_relaxed, второй магазин можно смело перемещать перед первым. Это добавит некоторую дополнительную работу между загрузкой value и ее использованием, что может помешать ненужным киоскам. Однако, если memOrd равно memory_order_seq_cst, переключение хранилищ не должно быть разрешено, потому что какой-то другой поток может рассчитывать на ai1, уже установленный на value, если ai2 установлен в 1.
Что мне интересно, почему порядок памяти определяется как параметр времени выполнения, а не время компиляции. Есть ли какая-либо причина для того, чтобы кто-то исследовал среду во время выполнения, прежде чем выбрать лучшую семантику операций с памятью?