Я играл с Godbolt и был удивлен, увидев, что следующий простой код C++ имеет разные скомпилированные выходные данные на x86-64 gcc 10.2 и x86-64 clang 11.0.0 с оптимизацией уровня -O2
.
static int x = 0;
int const y = x;
int main()
{
x = 0; // should be optimised out?
}
gcc:
main:
mov DWORD PTR x[rip], 0
xor eax, eax
ret
_GLOBAL__sub_I_main:
ret
лязг:
main: # @main
xor eax, eax
ret
Почему clang может доказать, что x
не используется, и оптимизировать его, но не gcc?
--> gcc.gnu.org/bugzilla если подобного отчета еще нет.
Оптимизаторы оптимизируют только то, что в них реализовано.
В этом случае я считаю, что Clang прав с оптимизацией, поскольку инициализация в main — это самое первое назначение, которое происходит с глобальным. Эту глобальную переменную нельзя трогать, так как инициализация глобальных переменных в нескольких единицах компиляции не может полагаться на глобальные переменные из другой единицы компиляции.
Поскольку вы не инициализируете какой-либо другой глобальный объект, который изменяется a
, значение было равно 0 до присваивания, и оно не требуется.
Я думаю, что это всего лишь крайний случай, когда моделирование clang приводит к оптимизации кода. Если вы используете более сложный код, такого рода оптимизации, скорее всего, даже не поддаются измерению.
Потому что оптимизаторы сложно писать и иногда они действительно делают то, что мы хотим, но не всегда?