LINUX.ORG.RU

История изменений

Исправление 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.

В общем, игрушечный пример, встреча в реальной жизни с которым - близка к нулю.