На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (32) « Первая ... 26 27 [28] 29 30 ... Последняя »  ( Перейти к последнему сообщению )  
> Развейте мои сомнения: упростится ли программирование при переходе от C к C++?
    Цитата OpenGL @
    Выделяется память, создаётся элемент в нужном месте, перемещаются или копируются элементы из старого массива, вызываются деструкторы, освобождается память. Как-то так.

    Какой–то тяжеловатый реаллок получается. Неужели он так и работает? Я почему–то думал, что он просто бинарные данные копирует.
      Цитата Олег М @
      Цитата OpenGL @
      Выделяется память, создаётся элемент в нужном месте, перемещаются или копируются элементы из старого массива, вызываются деструкторы, освобождается память. Как-то так.

      Какой–то тяжеловатый реаллок получается. Неужели он так и работает? Я почему–то думал, что он просто бинарные данные копирует.

      Как ты собрался копируя бинарные данные обеспечить корректность работы объектов?

      Добавлено
      В случае, если у тебя noexcept конструкторы перемещения, то он сможет сделать перемещение, а не копирование.
        Цитата JoeUser @
        И, тем не менее, помогать компилятору помогать тебе контролировать тебе свои типы - нехорошая черта (типизированного) языка.
        Скажем так: для чего применять этот принцип, это уже неважно. Вот такая строчка:
        ExpandedWrap disabled
          extern int static_check[(INT_MAX+INT_MIN == -1)*2-1];
        вполне себе заменяет static_assert в младших Стандартах, но при этом объявления массивов с константным выражением в качестве его длины никакого отношения к контролю инвариантов не имеют.
        SFINAE в первую очередь позволяет писать обобщённый код, как и перегрузка позволяет статические мультиметоды. Выкинь вон ту "SFINAE"-вую фичу из перегрузки, и она станет совершенно бесполезной вещью. Классы тоже предназначены для ООП, а используются для ООП дай бог чтоб в половине случаев.
          Цитата D_KEY @
          Как ты собрался копируя бинарные данные обеспечить корректность работы объектов?

          В большинстве случаев не вижу проблем
            Цитата Олег М @
            Цитата D_KEY @
            Как ты собрался копируя бинарные данные обеспечить корректность работы объектов?

            В большинстве случаев не вижу проблем

            Как бы ты реализовал переаллокацию для вектора? Сделаешь побитовое копирование? И как ты будешь определять, сломаешь ли ты клиенту его объекты или нет?

            Добавлено
            Да и вообще, побитово копировать объекты, для которых пользователь задал конструктор копирования/переноса как-то странно, тебе не кажется?
              Цитата D_KEY @
              Как бы ты реализовал переаллокацию для вектора? Сделаешь побитовое копирование? И как ты будешь определять, сломаешь ли ты клиенту его объекты или нет?

              Добавлено Вчера, 15:05
              Да и вообще, побитово копировать объекты, для которых пользователь задал конструктор копирования/переноса как-то странно, тебе не кажется?


              Ну да, с std::vector ситуация оказалась совсем тяжёлая, в gcc. При каждом выходе за capacity, он выделяет новый массив, с другим адресом, и переносит туда все объекты. Причём предпочтительно использует конструктор копирования.

              Добавлено
              Почему, в общем-то понятно, но ни разу не радует
                Цитата Олег М @
                Ну да, с std::vector ситуация оказалась совсем тяжёлая, в gcc. При каждом выходе за capacity, он выделяет новый массив, с другим адресом, и переносит туда все объекты. Причём предпочтительно использует конструктор копирования.
                Почему, в общем-то понятно, но ни разу не радует
                А что есть мысли как сделать по-другому? Простой memcpy можно использовать для тривиальных POD-ов, и современные компиляторы достаточно умны, чтобы такие данные перебрасывать простым бинарным копированием.
                И вообще это стандартная реализация и она отлично работает. Capacity при реаллокации рассчитывается с запасом, так что даже при непрерывном росте массива, количество реаллокаций будет расти логарифмически. А если заранее известен размер, то можно сразу удлинить массив до необходимого размера.
                  Цитата applegame @
                  А что есть мысли как сделать по-другому? Простой memcpy можно использовать для тривиальных POD-ов, и современные компиляторы достаточно умны, чтобы такие данные перебрасывать простым бинарным копированием.
                  И вообще это стандартная реализация и она отлично работает. Capacity при реаллокации рассчитывается с запасом, так что даже при непрерывном росте массива, количество реаллокаций будет расти логарифмически. А если заранее известен размер, то можно сразу удлинить массив до необходимого размера.


                  Мысль такая - многие классы можно переносить при помощи простого memcpy, ничего это этого не изменится. Соответственно, память под массив можно смело выделять при помощи realloc.
                    Цитата Олег М @
                    Мысль такая - многие классы можно переносить при помощи простого memcpy, ничего это этого не изменится.

                    А многие нельзя переносить. Как определить, когда можно, а когда нет?
                    Задавать политику переноса/копирования извне?

                    Добавлено
                    Цитата Олег М @
                    Соответственно, память под массив можно смело выделять при помощи realloc.

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

                    Добавлено
                    Цитата Олег М @
                    При каждом выходе за capacity, он выделяет новый массив, с другим адресом, и переносит туда все объекты.

                    Да, но capasity увеличивается не на один элемент :)

                    Цитата
                    Причём предпочтительно использует конструктор копирования.

                    Хм. Должен вызывать перемещение, если это возможно (т.е. если у элемента noexcept конструктор перемещения).
                      Цитата D_KEY @
                      А многие нельзя переносить. Как определить, когда можно, а когда нет?
                      Задавать политику переноса/копирования извне?


                      Никак не определять. Использовать в частных случаях

                      Цитата D_KEY @
                      Тут нужно измерять, стоит ли оно того. Вполне может оказаться, что реальный прирост производительности невелик.


                      Выглядит так, что если для массива std::string не будут каждый вызываться конструкторы копирования, то работать должно быстрее.
                      std::vector и базовые типы, похоже по-одному копирует

                      Добавлено
                      Цитата D_KEY @
                      Хм. Должен вызывать перемещение, если это возможно (т.е. если у элемента noexcept конструктор перемещения).


                      Быстрее было бы вызвать конструктор по-умолчанию, потом move-конструктор. Но нет, вызывается конструктор копирования.
                        Цитата Олег М @
                        Выглядит так, что если для массива std::string не будут каждый вызываться конструкторы копирования, то работать должно быстрее.
                        std::vector и базовые типы, похоже по-одному копирует

                        Ты всерьёз считаешь, что std::string можно копировать побитово? Нет, серьёзно? :o
                          Цитата Олег М @
                          Цитата D_KEY @
                          Хм. Должен вызывать перемещение, если это возможно (т.е. если у элемента noexcept конструктор перемещения).


                          Быстрее было бы вызвать конструктор по-умолчанию, потом move-конструктор.

                          Зачем конструктор по умолчанию вызывать?

                          Цитата
                          Но нет, вызывается конструктор копирования.

                          Или ты не так используешь или баг в компиляторе.
                          Сообщение отредактировано: D_KEY -
                            Цитата Олег М @
                            Быстрее было бы вызвать конструктор по-умолчанию, потом move-конструктор. Но нет, вызывается конструктор копирования.

                            Ни разу не быстрее. Конструктор по-умолчанию инициализирует поля дефолтными значениями (или тем, что задал программист). А конструктор перемещения - сразу тем, что было в "старом" объекте. В итоге - вместо двух инициализаций - одна. Почувствуй разницу.
                                Цитата Flex Ferrum @
                                Ни разу не быстрее. Конструктор по-умолчанию инициализирует поля дефолтными значениями (или тем, что задал программист). А конструктор перемещения - сразу тем, что было в "старом" объекте. В итоге - вместо двух инициализаций - одна. Почувствуй разницу.


                                Против копирования, думаю, разница будет ощутимая

                                Добавлено
                                Цитата D_KEY @

                                Какой компилятор?
                                Сообщение отредактировано: Олег М -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0709 ]   [ 14 queries used ]   [ Generated: 19.05.24, 00:24 GMT ]