На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (42) « Первая ... 36 37 [38] 39 40 ... Последняя »  ( Перейти к последнему сообщению )  
> Инициализировать или не инициализировать , it's the question
    Цитата Flex Ferrum @
    Так она есть. Для каждого типа default initialization строго описана. :D
    Отсутствие инициализации - тоже инициализация. Офигительная казуистика. :D
      Цитата MyNameIsIgor @
      Мой вопрос то в другом: почему она разная? Для одних типов я получаю неопределённое поведение, а для вторых - нет.

      В языке разные типы имеют разный "статус". Одни требуют вызов конструктора, другим он не нужен. Это же очевидно.
        Цитата JoeUser @
        Цитата MyNameIsIgor @
        Мой вопрос то в другом: почему она разная? Для одних типов я получаю неопределённое поведение, а для вторых - нет.

        В языке разные типы имеют разный "статус". Одни требуют вызов конструктора, другим он не нужен. Это же очевидно.

        Для меня это не очевидно :-?
          Цитата MyNameIsIgor @
          Хорошо, давайте zero initialization изменим.
          Кстати, а почему пустая строка? Мне вот "abcd" нравится.

          Так вот об том и речь: умолчательное поведение оно - как средняя температура по больнице.

          Цитата MyNameIsIgor @
          Не получится - например, при присваивании полезет удалять память по мусорному адресу.

          inet_addr - это POD-тип. Кто, куда и для чего полезет? Или, вот, другой пример. CRITICAL_SECTION. Для этой POD-структуры никакого варианта адекватной инициализации по умолчанию просто не существует - нужно спец. функцию вызывать. Умолчательные значения для хэндлов в той же винде - очень сильно зависят от того, что это за хэндл. Где-то - 0, где-то - -1, где-то - nullptr. Весёлый такой зоопарк, да? И как с этим должно справляться zero-initialization по-умолчанию? В коде будет просто феерия, сложно отлавливаемая. Если, как написал Крайзер, обращение к неинциализированной переменной-хендлу ты ещё можешь отловить, то вот обращение к неправильно инициализированному хендлу - уже нет.

          Добавлено
          Цитата applegame @
          Отсутствие инициализации - тоже инициализация. Офигительная казуистика.

          Ну ты стандарт то открой. :)
            Цитата Flex Ferrum @
            inet_addr - это POD-тип. Кто, куда и для чего полезет?

            std::vector полезет, если его конструуктор по умолчанию не проставит нулевой размер имеющихся данных.
              Цитата JoeUser @
              Кстати, смех смехом, а тогда бы любую переменную можно было бы инициализировать не подобием 0, NULL, nullptr - а однозначным NAN и ловить эксепшены при использовании неинициализированных переменных. Но это еще один слой жирка в и без того знатно пополневший Си.
              В D все флоаты по умолчанию заполняются именно NaN - http://dlang.org/type :D
              Поверь, жирка от инициализации по умолчанию, практически нет.
                Цитата Flex Ferrum @
                Или, вот, другой пример. CRITICAL_SECTION. Для этой POD-структуры никакого варианта адекватной инициализации по умолчанию просто не существует - нужно спец. функцию вызывать. Умолчательные значения для хэндлов в той же винде - очень сильно зависят от того, что это за хэндл. Где-то - 0, где-то - -1, где-то - nullptr. Весёлый такой зоопарк, да?

                А сейчас он не весёлый, а вполне предсказумый что ли, с мусором то? Хуже не станет.
                  Цитата applegame @
                  Отсутствие инициализации - тоже инициализация. Офигительная казуистика.

                  Ничего странного. Инициализация - двухфазная операция (выделение памяти + приведение данных в изначальное рабочее состояние). Для встроенных типов вторая фаза не всегда нужна. Ее и не навязывают. Это нормально. Для библиотечних типов такое допустить нельзя, иначе объект будет в нестабильном состоянии. Встроенные типы на 100% функциональны сразу же после выделения памяти.
                    Цитата MyNameIsIgor @
                    А сейчас он не весёлый, а вполне предсказумый что ли, с мусором то? Хуже не станет.

                    Сейчас ты его статиканализаторами отловить можешь.

                    Цитата MyNameIsIgor @
                    std::vector полезет, если его конструуктор по умолчанию не проставит нулевой размер имеющихся данных.

                    Нет. Потому что у inet_addr нет конструктора и деструктора.
                      Скрытый текст
                      Цитата applegame @
                      Поверь, жирка от инициализации по умолчанию, практически нет.

                      Я еще до D толком не добрался, всему свое время. Пока не разберусь с D под LLVM, учить ниче не буду))
                        Цитата Flex Ferrum @
                        Нет. Потому что у inet_addr нет конструктора и деструктора.

                        А память то, память std::vector вернуть системе не желает?
                          Цитата MyNameIsIgor @
                          А память то, память std::vector вернуть системе не желает?

                          Так память то он вернёт. Тут ведь фишка в том, что именно будет в этой памяти.
                            Цитата Flex Ferrum @
                            Так память то он вернёт. Тут ведь фишка в том, что именно будет в этой памяти.

                            Как же он её вернёт, если указатель на данные будет мусорным? Это не говоря о том, что обращение к такой переменной - неопределённое поведение.
                            Напоминаю, я говорю о случае, когда std::vector не будет инициализировать свои поля в конструкторе по умолчанию.

                            Добавлено
                            Цитата Flex Ferrum @
                            Сейчас ты его статиканализаторами отловить можешь.

                            Они могут отловить и при инициализации нулями исходя из того, что с критической секцией будут делать.
                              Цитата MyNameIsIgor @
                              Как же он её вернёт, если указатель на данные будет мусорным

                              Э... Что-то ты, видимо, не понимаешь. POD-структура занимает какой-то кусок памяти, равный по размеру её sizeof. Никого не интересует, что там в этом куске памяти. Вектор - в том числе. Его задача - выделить этот кусок и вернуть обратно при разрушении. А то, что там будет мусор (в полях POD-структуры) - так это не проблема vector'а.
                                Цитата Flex Ferrum @
                                Э... Что-то ты, видимо, не понимаешь.

                                Давайте поймём что.
                                Я говорю, что будь комитет последовательным, он требовал, чтобы std::vector<T> v; не тратило такты, как не тратит int x; Это может быть только тогда, когда конструктор по умолчанию не будет прописывать что-то в поля. В таком случае при операция с таким вектором мы получим неопределённое поведение, и как пример я указал присваивание ему другого вектора. И это не зависит от того, является ли T POD или не POD.
                                Чего я не понимаю?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0688 ]   [ 15 queries used ]   [ Generated: 9.05.24, 15:10 GMT ]