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


    :good: +1 Именно так. Инициализировать надо тем, чем нужно, и тогда, когда нужно. А инициализация "чем-попало" (пусть нулем), на всякий случай - признак паранойи. Более того, неправильная инициализация "на всякий случай", привенест дополнительную уверенность в том, что "авось прокатит, даже если ошибусь". От лукавого это!
      Цитата Pacific @
      Если i передается как неконстантный указатель, то после этого вызова она будет считаться инициализированной. Реализация extern_function на совести того, кто ее писал. Вообще, понадобится синтаксис, объясняющий компилятору, что вот этот формальный параметр функции - неинициализированный, и его нельзя сразу использовать.

      Так решение-то какое? Разрешать или запрещать такое?
        shm
        Запретить "int x;" без инициализации. "int x = void;" - тоже сомнительно. Переменную можно объявить в том блоке, где она впервые используется, и сразу же инициализировать разумным начальным значением.
          Цитата JoeUser @
          :good: +1 Именно так. Инициализировать надо тем, чем нужно, и тогда, когда нужно. А инициализация "чем-попало" (пусть нулем), на всякий случай - признак паранойи. Более того, неправильная инициализация "на всякий случай", привенест дополнительную уверенность в том, что "авось прокатит, даже если ошибусь". От лукавого это!
          То есть когда std::string инициализируется "чем попало" (пустой строкой) - это нормально, а int уже не нормально. :)
          Сообщение отредактировано: applegame -
            Цитата applegame @
            Это другая крайность. Безопасность в ущерб читабельности и удобству.

            А вот я не уверен, что "в ущерб". На самом деле, тут так же, как со всякими разными cast'ами.

            Добавлено
            Цитата applegame @
            То есть когда std::string инициализируется "чем попало" (пустой строкой) - это нормально, а int уже не нормально.

            Ещё раз. И string и int (с точки зрения клиента) инициализируются "чем попало" в случае default-инициализации.

            Добавлено
            Цитата D_KEY @
            Но ведь она уже сделана для некоторых типов. А для некоторых у нас мусор.

            Для "некоторых типов" её делает сам разработчик, а не компилятор.
              Цитата Flex Ferrum @
              Ещё раз. И string и int (с точки зрения клиента) инициализируются "чем попало" в случае default-инициализации.

              В таком случае std::string нарушает принцип нулевой стоимости. Как люди последовательные, мы должны потребовать, чтобы конструктор по умолчанию для std::string заполнял всё мусором ;)
                Цитата Flex Ferrum @
                Ещё раз. И string и int (с точки зрения клиента) инициализируются "чем попало" в случае default-инициализации.
                Еще раз, с точки зрения клиента, string инициализируется конкретным значением, а int действительно, чем попало. Ты агрументируешь в стиле: с точки зрения банальной эрудиции, и атеизм и христианство являются религиями.
                Сообщение отредактировано: applegame -
                  Цитата applegame @
                  Цитата Flex Ferrum @
                  Ещё раз. И string и int (с точки зрения клиента) инициализируются "чем попало" в случае default-инициализации.
                  Еще раз, с точки зрения клиента, string инициализируется конкретным значением, а int, действительно чем попало. Ты агрументируешь в стиле: с точки зрения банальной эрудиции, и атеизм и христианство являются религиями.

                  Нет, аргументация там такая: таков контракт этого типа. Контракт int - мусор, контракт std::string - пустая строка.
                    Цитата OpenGL @
                    Я так и не понял, почему ты утверждаешь, что поймать конкретное неправильное значение сложнее, чем случайное и способное иногда становиться верным.
                    Проблема не в "поймать", а в "заметить, что оно неправильное". Это алгоритмическая ошибка, а не ошибка реализации. Поэтому анализировать нужно не код, который перед глазами, и который достаточно просто видеть, а алгоритм, который либо описан в документации, и его ещё надо сопоставить с кодом, либо его ещё надо восстановить по коду, что ещё сложнее.
                    И поэтому тесты с такими ошибками ничего не могут поделать. Если функция должна искать максимум в векторе, а на самом деле ищет минимум, и документация писалась по коду, тест будет пасситься хоть тресни.

                    Добавлено
                    Цитата applegame @
                    Ага, ленивый человек увидев отсутствие инициализации бросится перечитывать доку mmap. Не смешите, в реальности, как сказал D_KEY, ленивый человек тупо посмотрит на "== 0" и проинициализирует переменную нулем же. После чего ситуация станет эквивалентной неверной дефолтной инициализации.
                    Ну если васрать, то static_cast<> вам в помощь.
                    Цитата applegame @
                    Undefined Behavior - зло. И таких мест в языке должно быть, как можно меньше.
                    Безусловно. Но тестеры на тёмной стороне, и просто обожают UB, не знал?

                    Добавлено
                    Цитата D_KEY @
                    Но ведь она уже сделана для некоторых типов. А для некоторых у нас мусор. Надо или делать мусор для всех, или вызывать дефолтный конструктор для всех. Ну или есть еще вариант с принудительным явным вызовом(и =void).
                    Более того, я бы даже для std::complex<> не делал бы дефолтную инициализацию, т.к. это класс без состояний, т.е. тупо POD, просто методов в него напихали.
                      Цитата Qraizer @
                      Проблема не в "поймать", а в "заметить, что оно неправильное". Это алгоритмическая ошибка, а не ошибка реализации. Поэтому анализировать нужно не код, который перед глазами, и который достаточно просто видеть, а алгоритм, который либо описан в документации, и его ещё надо сопоставить с кодом, либо его ещё надо восстановить по коду, что ещё сложнее.

                      Это я понял. Непонятно, почему int a; без инициализации при её необходимости - ошибка реализации, а то же самое, но с дефолтовой неверной инициализацией - ошибка алгоритма. По мне так принципиальной разницы между этими двумя случаями нет. Точнее, есть - второе работает неправильно всегда, но эта разница говорит скорей в его пользу, чем против.

                      Добавлено
                      Цитата Qraizer @
                      Более того, я бы даже для std::complex<> не делал бы дефолтную инициализацию, т.к. это класс без состояний, т.е. тупо POD, просто методов в него напихали.

                      А для std::pair<int, int>? Или каких-нибудь указателей?
                      Последние, кстати, nullptr-ом инициализировать по-умолчанию вполне логично по той же причине, по которой дефолтовый std::string - пустая строка.
                      Сообщение отредактировано: OpenGL -
                        Цитата OpenGL @
                        Последние, кстати, nullptr-ом инициализировать по-умолчанию вполне логично по той же причине, по которой дефолтовый std::string - пустая строка.
                        Ни в коем случае. Потому что
                        Цитата Qraizer @
                        тестеры на тёмной стороне, и просто обожают UB, не знал?
                        Сообщение отредактировано: applegame -
                          Кстати, по поводу предложения всегда писать либо инициализатор, либо = void: а что будет означать последнее для пользовательских типов?
                            Цитата MyNameIsIgor @
                            Кстати, по поводу предложения всегда писать либо инициализатор, либо = void: а что будет означать последнее для пользовательских типов?

                            default initialization.
                              Цитата applegame @
                              То есть когда std::string инициализируется "чем попало" (пустой строкой) - это нормально, а int уже не нормально.


                              Цитата MyNameIsIgor @
                              В таком случае std::string нарушает принцип нулевой стоимости. Как люди последовательные, мы должны потребовать, чтобы конструктор по умолчанию для std::string заполнял всё мусором


                              int имеет предопределенный размер, меньше нельзя, он и получает мусор данного размера. Строка имеет меньший размер - нулевой, и получает нулевой ... мусор! В обеих случаях все равнозначно. И это правильно. Повторюсь, хватит "бессмысленных страховочных" действий! Вы еще перепроверьте на всякий случай, а действительно ли процессор правильно сложил 5+5 :whistle:

                              Инициализировать надо там, где надо инициализировать. Проверять нужно то, что нужно проверять. Остальное от лукавого. И ваще, долой ваши жирные программы! :lol:
                                Цитата JoeUser @
                                Строка имеет меньший размер - нулевой

                                ЧЯДНТ? :jokingly:

                                Добавлено
                                Цитата JoeUser @
                                И ваще, долой ваши жирные программы!

                                Вы полагаете, что ваши глючные лучше? :rolleyes:
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (42) « Первая ... 34 35 [36] 37 38 ...  41 42


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0801 ]   [ 15 queries used ]   [ Generated: 27.04.24, 13:40 GMT ]