Почему экземпляры данных по умолчанию не равны NULL? - PullRequest
3 голосов
/ 09 апреля 2011

Меня всегда беспокоило то, почему компилятор не устанавливает данные в NULL, если ничего не указано? Я не вижу никакой причины для этого, и, конечно, это должно быть лучше, чем мусор, который упоминается в противном случае?

Ответы [ 5 ]

3 голосов
/ 09 апреля 2011

Единственная веская причина в том, что это не так эффективно.C и C ++ (в отличие от языков более высокого уровня), как правило, не делают ничего, о чем вы не просили.Вот как они получили репутацию очень быстро.Другие языки безопаснее, но медленнее.

Если вы хотите инициализировать поля чем-либо, кроме NULL, было бы пустой тратой времени сначала инициализировать их в NULL и , затем инициализировать ихвсе, что вы установили.Итак, C / C ++ предполагает, что вы знаете, что делаете.

3 голосов
/ 09 апреля 2011

Первоначальной причиной была «скорость» - переменные стали иметь смысл только после того, как вы присвоили им что-то , поэтому была предпринята попытка не делать бессмысленную инициализацию 0, которая в течение нескольких миллисекунд программист просто перезаписывает данные с фактическими данными.

Хотя это не совсем дорого , компиляторы, вероятно, сегодня не обнуляют переменные по той же причине: любой компилятор, который работает, будет выглядеть медленнее по сравнению с другими компиляторами в тестах производительности.

0 голосов
/ 09 апреля 2011

Установка выделенной памяти в нули и пометка структур как «ноль» занимает много времени.В вашем приложении могут быть критические по времени разделы, в которых объекты должны создаваться как можно быстрее, после чего вы инициализируете их настолько минималистично, насколько это возможно, чтобы их можно было использовать.Таким образом, компилятор и среды выполнения выполняют как можно меньше работы для создания объектов и предоставляют вам возможность завершить их настройку по своему усмотрению.

Некоторые языки высокого уровня реализуют дальнейшую инициализацию в 'null'но тогда они не всегда подходят для срочных приложений.

0 голосов
/ 09 апреля 2011

Если вы объявите переменную в куче ( не свободное хранилище, т. Е. Глобально и только глобально ), оно будет инициализировано равным 0.

Однако данные в стеке не выделяются для ускорения этого процесса. Нет смысла инициализировать данные в 0, если вы собираетесь их перезаписывать, что является предположением, сделанным с локальными (стековыми) данными.

0 голосов
/ 09 апреля 2011

Мое предположение из-за соображений скорости. Это были бы другие вызовы ЦП для этого.

...