Нет, их нельзя оптимизировать.
int* ptr = (int*)0x12345
устанавливает указатель на байт, адресуемый 0x12345
, который вы предположительно выделяете в другом месте? Однако такой адрес, будучи нечетным, не выровнен по байту, что в лучшем случае неоптимизировано.
*ptr = 2
назначает 2
этому адресу. Явная оптимизация этих строк приведет к другому состоянию памяти. Таким образом, они не могут быть оптимизированы.
Оптимизация без ссылок допускается с помощью анализа псевдонимов , с помощью которого можно определить, можно ли "получить доступ к хранилищу несколькими способами"
c участвует в анализе псевдонимов на основе типов :
- Две переменные разных типов не могут быть в одном и том же классе псевдонимов, поскольку это свойство строго типизированных языков без ссылок на память (т. Е. Ссылки на области памяти не могут быть изменены напрямую) языков, которые две переменные разных типов не могут совместно использовать. в одной и той же ячейке памяти одновременно.
- Выделения, локальные для текущего фрейма стека, не могут быть в том же классе псевдонимов, что и любое предыдущее распределение из другого фрейма стека. Это так, потому что новые выделения памяти должны быть непересекающимися со всеми другими выделениями памяти.
- В общем, каждое поле записи каждого типа записи имеет свой собственный класс псевдонимов, поскольку дисциплина ввода обычно допускает только записи одного типа с псевдонимом. Поскольку все записи типа будут храниться в памяти в одинаковом формате, поле может иметь псевдоним только для себя.
- Аналогично, каждый массив данного типа имеет свой собственный класс псевдонимов.
2 - настоящий кикер здесь, потому что он не выделяется локально для текущего фрейма стека, ptr
может быть связан с любым другим int
в программе, таким образом, компилятор не может оптимизировать это прочь.