Привет!
12 Jan 16 07:45, you wrote to me:
NS> если сюда попал нулл - значит песец уже случился, можно умирать в
NS> конвульсиях и проявлять любое неопределенное повеление.
Право на неопределенное поведение у генерируемого компилятором кода возникает
лишь после попадания нуля в ссылку. То есть, для того, чтобы невыполнение
проверки содержимого ссылки на нуль было обоснованным, компилятору придется
сгенерировать код для собственной такой проверки. :) Следовательно, выбросить
проверку, заданную программистом, еще на этапе компиляции, под предлогом
"оптимизации кода", компилятор оснований не имеет.
NS> a=5;
NS> b=7;
NS> if(a==7)
NS> насколько я понимаю, в этом контексте компилятор может смело выкинуть
NS> этот блок как недостижимый. а с нуллом ситуация аналогична.
В этом - может. А если "a", например, передано параметром функции, и
компилятор, строя граф вызовов, не имеет возможности определить все возможные
значения, то не может.
Аналогично, если у компилятора есть возможность убедиться в том, что ссылка
инициализирована валидным объектом, он может выкинуть код проверки ее
содержимого на нуль. Иначе - не имеет права.
Hу и вообще, любой промышленный компилятор позволяет себе такие оптимизации
лишь при явно заданных разрешениях. Ибо программа вполне может содержать
подобные проверки исключительно в отладочных целях, чтобы ловить как ссылки с
невалидными указателями (не только нулевыми, но и указывающими на
несуществующие объекты), так и случайную порчу содержимого переменных.
Компилятор, даже в отладочном режиме позволяющий себе вольности с кодом ради
буквального соблюдения стандарта, вряд ли будет востребован в серьезных
проектах.