val)
{
if(!val.load(std::memory_order_relaxed))
{
Do1();
}
if(!val.load(std::memory_order_relaxed))
{
Do2();
}
}
To
void foo(std::atomic<bool>& val)
{
auto ___tmp = !val.load(std::memory_order_relaxed);
if(___tmp)
{
Do1();
Do2();
}
}
А что именно ты хочешь про нее прочитать? В каких условиях компмлятор способен ее проделать?
Хочу "название" такой оптимизации, условия и какой-то реф пейдж чтобы ссылаться можно было. Не смог нагуглить
Наверное, потому, что такая оптимизация невозможна на атомиках.
https://stackoverflow.com/questions/33127973/can-atomic-loads-be-merged-in-the-c-memory-model
Там другой пример, где cst ordering.
Ну и приписка в конце ответа тоже есть.
seq_cst дает сильно меньше свободы оптимизатору чем relaxed
Ну ок, сейчас компиляторы консервативно боятся такое делать. Это не повод считать такую оптимизацию невозможной и не повод закладываться на ее отсутствие.
Вообще в коде автора оптимизация такого рода вообще невозможна, потому что невозможно доказать, что значение атомика не изменится между вызовами. Даже теоретически.
ну если реализация функции Do1 в том же TU, то почему бы и нет
Я исхожу из того, что Do1 и Do2 — чёрный ящик (как в вопросе).
Обсуждают сегодня