перешел в чат

етил, что clang и gcc оптимизируют создание или присваивание изменчивомуstruct объявлено в стеке, в некоторых сценариях. Например, следующий код:

struct nonvol2 {
    uint32_t a, b;
};

void volatile_struct2()
{
    volatile nonvol2 temp = {1, 2};
}

Собирает на лягушку чтобы:

volatile_struct2(): # @volatile_struct2()
  ret

С другой стороны, gcc не удаляет хранилища, хотя оптимизирует два подразумеваемых хранилища в один:

volatile_struct2():
        movabs  rax, 8589934593
        mov     QWORD PTR [rsp-8], rax
        ret

Как ни странно, Clang не будет оптимизировать энергозависимый магазин до одногоint переменная:

void volatile_int() {
    volatile int x = 42;
}

Компилируется в:

volatile_int(): # @volatile_int()
  mov dword ptr [rsp - 4], 1
  ret

Кроме того, структура с 1 членом, а не 2 не оптимизируется.

Хотя gcc не удаляет конструкцию в данном конкретном случае, возможно, она делает еще более агрессивные оптимизации в том случае, еслиstruct Сами члены объявленыvolatile, а неstruct Сам в пункте строительства:

typedef struct {
    volatile uint32_t a, b;
} vol2;

void volatile_def2()
{
    vol2 temp = {1, 2};
    vol2 temp2 = {1, 2};
    temp.a = temp2.a;
    temp.a = temp2.a;
}

просто компилируется до простогоret.

В то время как кажется совершенно «разумным» убрать эти магазины, которые практически невозможно отследить каким-либо разумным процессом, у меня сложилось впечатление, что в стандартеvolatile грузы и магазины считаются частьюнаблюдаемое поведение программы (в дополнение к вызовам функций ввода-вывода), полная остановка. Подразумевается, что они не подлежат удалению «как будто», поскольку это по определению изменитнаблюдаемое поведение программы.

Я ошибаюсь или кланг нарушает правила? возможностроительство исключен из случаев, когдаvolatile должны быть побочные эффекты?

Ответы на вопрос(1)

Ваш ответ на вопрос