На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (42) « Первая ... 31 32 [33] 34 35 ...  41 42  ( Перейти к последнему сообщению )  
> Инициализировать или не инициализировать , it's the question
    Цитата Pacific @
    А меня волнует. Если так сделать, скоро программы на C++ будут медленнее, чем на C#. И зачем тогда C++?
    Вопрос еще, а часто ли вообще нужно создавать переменные встроенных типов без инициализации?
      В блоге Скотта есть очень хороший комментарий:
      Цитата
      If we are going to break backwards compatibility, this seems like a half-measure:

      int x; // always zero-initialized
      int x = void; // never zero-initialized

      Why should we still allow

      int x;

      to compile at all? The problem is that allowing the implicit zero initialization can still hide bugs that sanitizers would no longer be able to find. All it does is make buggy code produce repeatable results, which can make it harder, not easier, to find the bug.

      How about making it so you always have to specify an initializer or void?

      Действительно, зачем вообще разрешать "int x;"? Нужно всегда заставлять инициализировать, либо каким-то значением, либо void'ом. Так будет меньше ошибок.
        Цитата Pacific @
        В блоге Скотта есть очень хороший комментарий

        Ничего хорошего в этом комментарии нет
        ExpandedWrap disabled
          template<class T>
          void foo()
          {
            T t;
          }
          MyNameIsIgor
          ExpandedWrap disabled
            template<class T>
            void foo()
            {
              T t = T();
              или
              T t = void;
            }

          И всего делов.
            Цитата Pacific @
            И всего делов

            Если сложно расставить = void в старом коде, то что уже говорить о том, что нужно будет расставлять = T()?

            Добавлено
            Так можно было бы делать изначально.
              Цитата applegame @
              Неправильно задокументирована? Поясни с примером, пожалуйста.
              Абстрактный пример в этой теме уже был. Что б не искать, перепостчу по памяти. Даже чуть улучшу.
              Допустим, программер написал
              ExpandedWrap disabled
                if (shMem == 0) shMem = mmap(0, SHM_SIZE, PROT_WRITE | PROT_READ, MAP_SHARED, GetFileNameFromUser(), 0);
              Как быстро ты найдёшь тут ошибку, и ориентировочно сколько времени она может жить в продакшне?
                MyNameIsIgor
                Я вообще-то по-прежнему против всех этих штучек с дефолтовым нулем. Я скорее за то, чтобы просто запретить "int x;" для POD-типов. Написать "int x = value;" или "SomeStruct y = {};" руки не отсохнут.

                P.S. И добавить "int x = void;" когда инициализация действительно не нужна. Но при этом добавить ошибку компиляции, если потом попытаться использовать x без инициализации.
                Сообщение отредактировано: Pacific -
                  Цитата Pacific @
                  И добавить "int x = void;" когда инициализация действительно не нужна. Но при этом добавить ошибку компиляции, если потом попытаться использовать x без инициализации.
                  Козлы (без обид, не про вас Pacific), расстрелять. :hunter:
                    Цитата Pacific @
                    MyNameIsIgor
                    ExpandedWrap disabled
                      template<class T>
                      void foo()
                      {
                        T t = T();
                        или
                        T t = void;
                      }

                    И всего делов.

                    Ну так я про то и говорил :D

                    Мне такой вариант не очень нравится. Но таки это лучше того, что есть сейчас.
                      Цитата Pacific @
                      Действительно, зачем вообще разрешать "int x;"? Нужно всегда заставлять инициализировать, либо каким-то значением, либо void'ом. Так будет меньше ошибок.


                      Лучше бы ввели какую прагму (инициализировать по-умолчанию, оставить как есть). И, имхо, лучше не нулем, а каким-либо предопределенным "значением ошибки". В дебаг/бета-сборке можно было бы ассертов наставить. А в продакшен-коде все эти двоиные инициализации выкинуть.
                        Цитата Pacific @
                        Я вообще-то по-прежнему против всех этих штучек с дефолтовым нулем. Я скорее за то, чтобы просто запретить "int x;" для POD-типов. Написать "int x = value;" или "SomeStruct y = {};" руки не отсохнут.

                        P.S. И добавить "int x = void;" когда инициализация действительно не нужна. Но при этом добавить ошибку компиляции, если потом попытаться использовать x без инициализации.
                        А смысл тогда что-то менять? Как раньше с разбегу писали без всяких значений, так теперь руки быстро привыкнут к = void, или понапишут плагинов в любимым IDE.
                          Цитата Qraizer @
                          А смысл тогда что-то менять? Как раньше с разбегу писали без всяких значений, так теперь руки быстро привыкнут к = void, или понапишут плагинов в любимым IDE.
                          +1. :good:
                            Цитата Qraizer @
                            Абстрактный пример в этой теме уже был. Что б не искать, перепостчу по памяти. Даже чуть улучшу.
                            Допустим, программер написал
                            ExpandedWrap disabled
                              if (shMem == 0) shMem = mmap(0, SHM_SIZE, PROT_WRITE | PROT_READ, MAP_SHARED, GetFileNameFromUser(), 0);
                            Как быстро ты найдёшь тут ошибку, и ориентировочно сколько времени она может жить в продакшне?

                            И в чем тут ошибка?
                              Цитата Pacific @
                              добавить "int x = void;" когда инициализация действительно не нужна. Но при этом добавить ошибку компиляции, если потом попытаться использовать x без инициализации.

                              ExpandedWrap disabled
                                int i = void;
                                extern_function(&i);

                              ?
                                Цитата applegame @
                                И в чем тут ошибка?

                                Выделение памяти будет только в случае предварительной инициализации shMem нулем (NULL). Если предварительной инициализации не было (мусор), то выделение будет случайным образом.

                                А код дурацкий. Имхо, имеет смысл так делать только в случае перевыделения по непонятным заранее зависимостям. Если выделение однократное, проверять нужно не сперва, а потом, со значением MAP_FAILED.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (42) « Первая ... 31 32 [33] 34 35 ...  41 42


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0718 ]   [ 14 queries used ]   [ Generated: 11.05.24, 14:47 GMT ]