перешел в чат
етил, что 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
должны быть побочные эффекты?