Избыточные операции MOV, если вы передаете переменную по ссылке - PullRequest
0 голосов
/ 01 января 2019

Есть ли причина, по которой современные компиляторы C ++ не могут оптимизировать избыточную mov инструкцию при изменении переменной, переданной по ссылке?

Медленно: https://gcc.godbolt.org/z/2Bmidk

Избыточныйmov:

10:        mov     QWORD PTR [rdi], rdx

Fast: https://gcc.godbolt.org/z/u3GMLx

Почему компилятор просто не сохраняет переменную begin_ в регистре процессора и записывает ее в память в конце функции

1 Ответ

0 голосов
/ 02 января 2019

Похоже, что это недопустимая оптимизация.Что если begin_ равен this, то есть адресу самого CharStream (и считывать байты любого объекта, используя char*)?В этом случае после первого чтения значение CharStream изменится, и значение диапазона может измениться [begin;конец)

Чтобы избежать этого, вы можете сделать одно из следующих действий:

  • принять CharStream по значению (чтобы его адрес был уникальным и не совпадал ни с одним char*): https://gcc.godbolt.org/z/QfOUwW (обратите внимание на изменение в поведении. Вам нужно будет вернуть поток, если вам нужны изменения)
  • использовать другой тип вместо char, чтобы он не мог иметь псевдоним с CharStream: https://gcc.godbolt.org/z/2_gREf (будьте осторожны, при считывании ваших данных может быть не определено использование Byte* вместо char*, поскольку изначально some_other_type*)
...