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

    Это ты его в прежние времена еще не застал :D
      Цитата Flex Ferrum @
      В С++ есть отличный способ указать компилятору и библиотеке на то, что структуру можно безопасно копипастить из одного куска памяти в другой. Это сделать такую структуру POD-структурой. И этим способом можно (и нужно) пользоваться для всех "частных случаев". В остальных случаях - copy/move-конструкторы. И это правильно.

      А std::string можно так пометить, или типа того?
        Цитата Олег М @
        А std::string можно так пометить, или типа того?

        Нет, конечно. И копипастить его нельзя.
          Цитата Flex Ferrum @
          И копипастить его нельзя

          Почему?
            Цитата Олег М @
            Почему?

            Потому что он не POD тип.

            Добавлено
            Простая структура данных
              Цитата Олег М @
              Почему?

              Потому. :) Если у типа есть нетривиальные конструкторы копии/перемещения, а также нетривиальный деструктор, то значит, что такое "особое поведение" было необходимо разработчику типа. Что ты будешь делать со "старой" копией объекта после копипаста? Откуда знаешь, что копипаст для внутренней структуры объекта вообще допустим и объект такой копипаст переживёт? Если хочется безопасного перемещения содержимого от одного объекта к другому - есть move-операции. Если хочется ходить по минному полю UB - ну да, можно попробовать копипастить. :)
                Цитата Flex Ferrum @
                Потому. Если у типа есть нетривиальные конструкторы копии/перемещения, а также нетривиальный деструктор, то значит, что такое "особое поведение" было необходимо разработчику типа. Что ты будешь делать со "старой" копией объекта после копипаста?

                Ты переводишь в общий случай. В данный момент это возможно или нет?
                Для старой памяти – просто сделать free и все

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

                Потому что он не POD тип.

                Сразу вспомнился фильм "Люди в черном"
                  Цитата Олег М @
                  Ты переводишь в общий случай. В данный момент это возможно или нет?

                  Нет, потому что класс std::string не является тривиальным. :)
                    По идее если бы можно было указать компилятору, что можно переместить объект с помощью memmove и забыть старый объект без вызова деструктора, то это вполне могло бы ускорить некоторые операции (в частности, расширение вектора для таких объектов). И строки, вектора и какие-нибудь stl контейнеры вполне такими объектами являются.
                      Цитата OpenGL @
                      По идее если бы можно было указать компилятору, что можно переместить объект с помощью memmove и забыть старый объект без вызова деструктора, то это вполне мого бы ускорить некоторые операции (в частности, расширение вектора для таких объектов). И строки, вектора и какие-нибудь stl контейнеры вполне такими объектами являются.

                      Компилятор это и сам определить может: http://en.cppreference.com/w/cpp/types/is_trivially_copyable
                        Цитата Flex Ferrum @
                        Компилятор это и сам определить может: http://en.cppreference.com/w/cpp/types/is_trivially_copyable

                        Это не то :) Допустим, есть строка. Внутри у неё есть указатель на её начало и длина. Если мы выполняем std::move для неё, то мы в новой строке задаём поля из старой, а в старой их обнуляем. Но в этом случае деструктор старой строки уже ничего не будет делать, а новая является, фактически, её побитовой копией. Соответственно, вместо явного вызова std::move и декструктора старого объекта тут достаточно будет простого memmove с забыванием старого.

                        Добавлено
                        В частности, все примеры по твоей ссылке являются такими вот is_opengl_movable :)
                          Цитата OpenGL @
                          Это не то Допустим, есть строка. Внутри у неё есть указатель на её начало и длина. Если мы выполняем std::move для неё, то мы в новой строке задаём поля из старой, а в старой их обнуляем. Но в этом случае деструктор старой строки уже ничего не будет делать, а новая является, фактически, её побитовой копией. Соответственно, вместо явного вызова std::move и декструктора старого объекта тут достаточно будет простого memmove с забыванием старого.


                          Я вот об этом же и пытаюсь сказать.
                          К тому же realloc, по-любому должен быстрее отрабатывать и экономичнее, когда можно просто увеличить размер блока
                            Цитата OpenGL @
                            Если мы выполняем std::move для неё, то мы в новой строке задаём поля из старой, а в старой их обнуляем. Но в этом случае деструктор старой строки уже ничего не будет делать, а новая является, фактически, её побитовой копией.

                            Ниче не понял. Ну обнулил ты, память от этого не удалится ведь? В итоге ты просто обнулил указатель в старой строке, но от этого ведь память не очистится автоматически. В итоге ты получил утечку памяти. Или я не так понял?
                            Плюс чтоб в новую строку переместить старую с помощью memmove, для нее, для новой нужно выделить память, кто это сделает?
                            Сообщение отредактировано: KILLER -
                              Цитата KILLER @
                              Ниче не понял. Ну обнулил ты, память от этого не удалится ведь? В итоге ты просто обнулил указатель в старой строке, но от этого ведь память не очистится автоматически. В итоге ты получил утечку памяти. Или я не так понял?

                              Грубая схема:

                              Выделил память #1, при помощи malloc
                              Вызвал для неё конструктор
                              Выделил память #2, malloc
                              Сделал memcpy из #1 в #2
                              Сделал free для #1
                              .....
                              Вызвал деструктор для #2
                              Сделал free для #2
                                Цитата Олег М @
                                Грубая схема:

                                Выделил память #1, при помощи malloc
                                Вызвал для неё конструктор
                                Выделил память #2, malloc
                                Сделал memcpy из #1 в #2
                                Сделал free для #1
                                .....
                                Вызвал деструктор для #2
                                Сделал free для #2

                                Ну а сейчас не так разве все работает? Я как понял вы обсуждаете как НЕ POD скопировать или переместить в другое место с помощью memcpy/memmove ?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (32) « Первая ... 28 29 [30] 31 32 


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0581 ]   [ 15 queries used ]   [ Generated: 3.05.24, 03:48 GMT ]