LINUX.ORG.RU

[C++][дыра в знаниях] дефолтная инициализация стандартных типов и указателей

 


0

2
int num;
//в num может быть мусор?
int *ptr;
//в ptr может быть мусор?

Вопросы в комментариях к коду. Поясните, пожалуйста. Внезапно осознал, что мой несколько не систематизированный подход к изучению языка привёл к тому, что я самостоятельно не смог ничего вспомнить.

Другими словами — в стандарте языка определены стандартные значение для num и ptr?

★★★★★

В С++ емнип всегда вызывается дефолтный конструктор T(). Но так как пишу и на си, и на плюсах, всегда все инициализирую сам.

staseg ★★★★★
()
Ответ на: комментарий от Obey-Kun

Почему?

Имхо, потому что глобальные переменные надо хранить, а нули хранить проще. А локальные динамически резервируются, и обнулять их пришлось бы специально.

Где про это можно почитать?

Здесь, например.

unsigned ★★★★
()
Ответ на: комментарий от unsigned

> Глобальные переменные инициализируются нулями, в локальных - мусор.

Сами не знаете и других с толку сбиваете! Стыдно должно быть!

На самом деле, нулями инициализируются переменные, расположенные в статической памяти, а переменные, расположенные в автоматической памяти (стеке) не инициализируются.

anonymous
()
Ответ на: комментарий от staseg

> В С++ емнип всегда вызывается дефолтный конструктор T()

Еще один говорит о том, чего не знает!

В плюсах у встроенных типов действительно есть дефолтный конструктор, но в отличие от пользовательских типов сам по себе он не вызывается.

anonymous
()
Ответ на: комментарий от staseg

> В С++ емнип всегда вызывается дефолтный конструктор T().

И у стандартных типов этот дефолтный конструктор просто ничего не делает.

geekless ★★
()

> //в num может быть мусор?

//в ptr может быть мусор?

И в num и в ptr будет мусор.

PS: сам Страуструп как-то заметил, что если бы не язык Си, то он бы исключил возможность создания неинициализированных переменных в С++.

anonymous
()
Ответ на: комментарий от geekless

Ну щас! Конструктор есть и делает. Анонимус выше правильно сказал, что он просто не вызывается автоматически.

staseg ★★★★★
()
Ответ на: комментарий от geekless

> И у стандартных типов этот дефолтный конструктор просто ничего не делает.

Сколько же на лоре неграмотных! Школота!

Дефолтный конструктор встроенных типов инициализирует их нулем. Это очень полезно, например, в шаблонах.

int i = int(); // значение i будет всегда 0

anonymous
()
Ответ на: комментарий от anonymous

Ладно, уточню: локальные static-переменные и static-поля класса тоже инициализируются нулями.

unsigned ★★★★
()
Ответ на: комментарий от staseg

> В С++ емнип всегда вызывается дефолтный конструктор T().

Ну щас! Конструктор есть и делает. Анонимус выше правильно сказал, что он просто не вызывается автоматически.

Еще добавь: а предыдущий коммент писал не я, а коте, пока я ходил покурить.

geekless ★★
()
Ответ на: комментарий от unsigned

> нули хранить проще

Расскажите, пожалуйста, чем нули хранить проще чем, например, единицы? Места меньше занимают что ли?

anonymous
()
Ответ на: комментарий от anonymous

> Сколько же на лоре неграмотных! Школота!

Лол, анонимная школота называет меня школотой.

Дефолтный конструктор встроенных типов инициализирует их нулем.

Ну и черт с ним. Я на плюсах писал последний раз 4 года назад, и мне как-то по барабану.

в шаблонах.

Не поминай к ночи.

geekless ★★
()
Ответ на: комментарий от geekless

Ошибся, что такого то? В чем именно ошибся, стало и так понятно из дальнейшего обсуждения. Суть твоей совершенно глупой придирки не ясна.

staseg ★★★★★
()

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

namezys ★★★★
()
Ответ на: комментарий от anonymous

> PS: если уж очень хочется, то можно использовать NULL

Везде использую NULL для указателей, это как минимум улучшает читабельность кода.

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от staseg

Ну ты ошибся, потом я ошибся. Суть твоей совершенно пафосной придирки не ясна.

geekless ★★
()
Ответ на: комментарий от unsigned

> man .bss-секция

Сами прочитали или понтов ради?

Область данных для .bss должен кто-то создать и инициализировать нулями. С таким же успехом ее можно создать и инициализовать единицами или двойками.

PS: инициализацию может выполнять сам C-runtime или ОС

anonymous
()
Ответ на: комментарий от annulen

> Шаблоны полезны, если их применяют не для фаллометрических целей

Только крайне не часто их применяют для иных целей.

geekless ★★
()
Ответ на: комментарий от Obey-Kun

> указатели по умолчанию тоже не инициализируются?

Да, тоже не инициализируются.

anonymous
()
Ответ на: комментарий от geekless

> Только крайне не часто их применяют для иных целей.

stl'ем и смарт-пойнтерами не пользуетесь?

anonymous
()
Ответ на: комментарий от anonymous

Ты о чем?

Места меньше занимают что ли?

Да, потому что не хранятся в бинарнике. В памяти, разумеется, занимают столько же.

unsigned ★★★★
()
Ответ на: комментарий от Obey-Kun

> Везде использую NULL для указателей

В нормальных компиляторах NULL это макрос для 0, если макросы не вызывают у вас отвращения то пользуйтесь. В новом стандарте для нулевых указателей планируется ключевое слово nullptr.

anonymous
()
Ответ на: комментарий от anonymous

> В новом стандарте для нулевых указателей планируется ключевое слово nullptr.

И когда он выйдет и я начну переделывать свои проекты на него, NULL можно будет заменить на nullprt одним мановением... а вот 0!

И вообще, http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=0_and_...

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от unsigned

> Ты о чем?

Да, потому что не хранятся в бинарнике.

Ноль не хранится в бинарнике не потому, что он ноль, а потому что есть такая договоренность. С таким же успехом можно было договориться об инициализации байтов значением 0xFF и не хранить его в бинарнике.

anonymous
()
Ответ на: комментарий от anonymous

>> Глобальные переменные инициализируются нулями, в локальных - мусор.

Сами не знаете и других с толку сбиваете! Стыдно должно быть!

На самом деле, нулями инициализируются переменные, расположенные в >статической памяти, а переменные, расположенные в автоматической >памяти (стеке) не инициализируются.

Вы где-то видели глобальные переменые, которые не в статической памяти размещены? И локальные не в стеке? Ай-ай-ай, стыдно должно быть, а ещё и на стипендию идёте. Давайте зачётку - два, придёте на перездачу.

anonymous
()
Ответ на: комментарий от Obey-Kun

> Везде использую NULL для указателей, это как минимум улучшает читабельность кода.

Ни когда не использовать NULL для укзателей. #define NULL 0 не всегда верно

namezys ★★★★
()
Ответ на: комментарий от Obey-Kun

> NULL можно будет заменить на nullprt одним мановением... а вот 0!

А 0 так и останется 0 )))

anonymous
()

там мусор 1может быть1 везде

guilder
()
Ответ на: комментарий от anonymous

Ну и далее «In fact, some C++ compilers, such as gcc 4.1.0, provide special definitions of NULL which enable them to give useful warnings, particularly in situations where sizeof(NULL) is not equal to sizeof(0).»

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от namezys

> Ни когда не использовать NULL для укзателей. #define NULL 0 не всегда верно

В отличие от классического Си в C++ значение пустого указателя предопределено стандартом языка и всегда равно 0 (целочисленному нулю, приведённому к типу «указатель»).

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от anonymous

> Вы где-то видели глобальные переменые, которые не в статической памяти размещены?

Нет

И локальные не в стеке?

Откройте для себя ключевое слово static и удивитесь тому, что по стандарту в плюсах нет понятия стек, но есть автоматическая память.

PS: рано вам еще в преподаватели недоучка

настоящий anonymous

anonymous
()
Ответ на: комментарий от Obey-Kun

> В отличие от классического Си в C++ значение пустого указателя предопределено стандартом языка и всегда равно 0 (целочисленному нулю, приведённому к типу «указатель»).

Зачем вы говорите о том, чего не знаете?

«The macro NULL is an implementation-defined C + + null pointer constant in this International Standard (4.10).180)

180) Possible definitions include 0 and 0L, but not (void*)0.»

anonymous
()
Ответ на: комментарий от Obey-Kun

А достигается это отклонением от стандарта. Именно поэтому новый стандарт предложит nullptr, чтобы устранить ситуации когда не удается 0 идентифицировать как нулевой указатель.

anonymous
()
Ответ на: комментарий от anonymous

Это копипаста из википедии. Надо было указать источник. Значит, там врут...

Obey-Kun ★★★★★
() автор топика
Ответ на: комментарий от namezys

Понятно. Всё равно буду использовать NULL, чтобы потом миграция на nullptr прошла просто.

Obey-Kun ★★★★★
() автор топика

А я не заморачиваюсь на такой ерунде и считаю по дефолту везде мусор.

Язык С и его клон С++ были придуманы как скоростные, а это значит, что программисту, а не компилятору/среде исполнения, виднее где что чем и когда инициализировать.

Опять же, зачем смущать народ и использовать переменную, которая не была проинициализирована явно/в дефолтном конструкторе и предполагать что там якобы будет 0/NULL? Не понимаю я этого. Даже если в стандартах что-то сказано про статическую память и т.д.

gandjubas
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.