Оптимизация компилятора C ++: удаление избыточных заборов памяти из циклаC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Оптимизация компилятора C ++: удаление избыточных заборов памяти из цикла

Сообщение Anonymous »

В этом коде:

Код: Выделить всё

#include 

extern std::atomic flag;

void f() noexcept
{
while (not flag.load(std::memory_order_relaxed))
;
std::atomic_thread_fence(std::memory_order_acquire);
}

void f2() noexcept
{
while (not flag.load(std::memory_order_acquire))
;
}
Должен ли компилятор с максимальным уровнем оптимизации, сгенерирует тот же код объекта для f () и f2 () ? Разве это не так, что приобретение заборов соответствует только между нагрузками разных местоположений памяти? оптимизация). Я спрашиваю, каким должно быть идеальное поведение компилятора в этом случае. Предложить возможные улучшения оптимизации компилятора не означает, что она нарушает стандарт. Если два разных сегмента кода логически эквивалентны, в идеале они должны привести к одному и тому же оптимизированному объектному коду. Для f () , возможно, компилятор должен (в идеале) предупреждать, что это движение логики из цикла зависит от архитектуры и лучше всего оставить оптимизатор, чтобы определить.


Подробнее здесь: https://stackoverflow.com/questions/797 ... rom-a-loop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»