История изменений
Исправление
pavlick,
(текущая версия)
:
Не, так не годится, у тебя изначальный тезис был иным
Когда программа потенциально дерефененсит нулл, она становится невалидной, а компилятор считает, что такую программу ему в своем уме не скормят. Поэтому он может сам себе доказать, исходя из того, что такой ptr всегда не нулл, что-то, что приведет к такому бинарнику, которого ты даже не ожидал.
Твой тезис был таким - если программа дереференсит указатель, то компилятор может решить, что он точно не ноль и сделать какие-то оптимизации, т.е грубо говоря ты допустил возможность выкидывания if основываясь лишь на том, что ptr дереференсится:
if (ptr) *ptr;
подтверждающего примера ты не показал.
Что касаем предоставленного примера - ну да, шланговская оптимизация. Вот только происходит она лишь потому, что значение в указатель приходит не во время рантайма и компилятор его может отследить. Реальный код ты сначала 100% скомпилишь с -O0 если хоть немного адекватный (плюс еще набор отладочных опций) и этот дереференс будет мигом отловлен ибо -O0. Если же значение указателя зависит от каких-то рантайм условий, то никакой подобной оптимизации не будет https://godbolt.org/z/cKaj564n8.
В общем, игрушечный пример, встреча в реальной жизни с которым - близка к нулю.
Исходная версия
pavlick,
:
Не, так не годится, у тебя изначальный тезис был иным
Когда программа потенциально дерефененсит нулл, она становится невалидной, а компилятор считает, что такую программу ему в своем уме не скормят. Поэтому он может сам себе доказать, исходя из того, что такой ptr всегда не нулл, что-то, что приведет к такому бинарнику, которого ты даже не ожидал.
Твой тезис был таким - если программа дереференсит указатель, то компилятор может решить, что он точно не ноль и сделать какие-то оптимизации, т.е грубо говоря ты допустил возможность выкидывания if основываясь лишь на том, что ptr дереференсится:
if (ptr) *ptr;
подтверждающего примера ты не показал.
Что касаем предоставленного примера - ну да, шланговская оптимизация. Вот только происходит она лишь потому, что значение в указатель приходит не во время рантайма и компилятор его может отследить. Реальный код ты сначала 100% скомпилишь с -O0 если совсем хоть немного адекватный (плюс еще набор отладочных опций) и этот дереференс будет мигом отловлен ибо -O0. Если же значение указателя зависит от каких-то рантайм условий, то никакой подобной оптимизации не будет https://godbolt.org/z/cKaj564n8.
В общем, игрушечный пример, встреча в реальной жизни с которым - близка к нулю.