|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
Я, конечно, знаю, что в общем случае так делать нельзя. Но всё же, если мы не вызываем методы контейнера, которые приводят к копированию, то почему бы и нет? Вот нужно добиться такого функционала: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Я понимаю, что тут в resize() цикл по копированию элементов. Можно ли это как-то обойти? Ведь мне не нужно копирование. Нужно разместить N элементов, причём N неизвестно на этапе компиляции. С точки зрения С++ сделать это можно. Но вот с точки зрения STL? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 14:56 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
petravНо всё же, если мы не вызываем методы контейнера, которые приводят к копированию, то почему бы и нет? К копированию приводит любой метод помещения объекта в контейнер. Контейнер, в который нельзя поместить объекты - бесполезен. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 15:22 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravНо всё же, если мы не вызываем методы контейнера, которые приводят к копированию, то почему бы и нет? К копированию приводит любой метод помещения объекта в контейнер. Контейнер, в который нельзя поместить объекты - бесполезен. Да, нет, возможно. Я не додумал. Хоть это и не совсем то что мне нужно. Вот если бы создать std::vector конструктором по умолчанию, пустым. А потом сделать resize(). Но вот это уже невозможно, ведь при компиляции resize() неизвестно ведь пустой вектор или нет. Ну да... не очень удобно. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 15:47 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
Значит лёгким движением руки некопируемый объект превращается в копируемый: Код: sql 1.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 15:58 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
Поместить в вектор некопируемый объект можно при помощи emplace_back. Только надо сделать некопируемый объект - перемещаемым(moveable). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 16:32 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
alex_k Поместить в вектор некопируемый объект можно при помощи emplace_back. Только надо сделать некопируемый объект - перемещаемым(moveable). Сильно сомневаюсь. If the new size() is greater than capacity() then all iterators and references (including the past-the-end iterator) are invalidated. Otherwise only the past-the-end iterator is invalidated. Это же означает копирование вектора (элементов), если у нас зарезервированное место закончилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 18:58 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
petrav, зачем их копировать? их надо перенести ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 19:03 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Значит лёгким движением руки некопируемый объект превращается в копируемый: Код: sql 1.
Тогда уж так: Код: plaintext 1.
Мне не нужно добавлять/удалять элементы. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 19:15 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
petrav Мне не нужно добавлять/удалять элементы. std::shared_ptr это умный указатель, сам объект никуда не перемещается. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 19:44 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
petravМне не нужно добавлять/удалять элементы. Тогда назачем тебе вообще вектор? Код: sql 1.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 20:02 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravМне не нужно добавлять/удалять элементы. Тогда назачем тебе вообще вектор? Код: sql 1.
Я не пользуюсь оператором [], только метод at(). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 20:10 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
alex_k petrav, зачем их копировать? их надо перенести Да это мысль. Наверное, нужно написать конструктор/оператор перемещения, к сожалению, не очень в этом разбираюсь. Но тут дело в чём? Вот эти не копируемые объекты по сути представляют собой набор байт. Т.е. это почти POD, эти объекты можно скопировать с помощью std::memcpy(). Но по логике программы их копировать не нужно; из перфекционизма я хочу запретить их копирование. Но если пойти по пути предложенном вами и написать эти конструктор и оператор перемещения, то... они начнут копироваться внутри std::vector! Я может что-то не понимаю, но такой вот философский момент возникает для рассмотрения. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 20:27 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
petrav alex_k petrav, зачем их копировать? их надо перенести Да это мысль. Наверное, нужно написать конструктор/оператор перемещения, к сожалению, не очень в этом разбираюсь. Но тут дело в чём? Вот эти не копируемые объекты по сути представляют собой набор байт. Т.е. это почти POD, эти объекты можно скопировать с помощью std::memcpy(). Но по логике программы их копировать не нужно; из перфекционизма я хочу запретить их копирование. Но если пойти по пути предложенном вами и написать эти конструктор и оператор перемещения, то... они начнут копироваться внутри std::vector! Почитай Мейерса , тоненькая книжка, перемещение это не копирование, а просто компилятор делает так что сразу пишешь туда куда перемещаешь, т.е. по факту объект создается в контейнере. Все это надо для многопоточности, т.к. пока один поток копирует - другой может поменять то что копируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 20:42 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
Dima T Почитай Мейерса , тоненькая книжка, перемещение это не копирование, а просто компилятор делает так что сразу пишешь туда куда перемещаешь, т.е. по факту объект создается в контейнере. Все это надо для многопоточности, т.к. пока один поток копирует - другой может поменять то что копируется. Я так понимаю, что конструкторы/операторы перемещения имеют смысл только для классов аля std::string. Когда указатель на char просто копируется в объект-приёмник, а в объекте-источнике зануляется. Это не тот случай. PS: Да, почитаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.06.2020, 20:53 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
petravЯ не пользуюсь оператором [], только метод at(). А в чём смысл такого бокса с рукой, привязанной к ноге? Пользуешься at() - добавь его к unique_ptr, это же всего лишь темплейт. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2020, 12:32 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov petravЯ не пользуюсь оператором [], только метод at(). А в чём смысл такого бокса с рукой, привязанной к ноге? Для проверки выхода за пределы массива. А что это моветон? :) Dimitry Sibiryakov Пользуешься at() - добавь его к unique_ptr, это же всего лишь темплейт. Тут я вас не понял. Что и куда вы предлагаете добавить? Просто в вашем варианте N указателей, но мне тут хватит одного. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.06.2020, 12:52 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
petrav только для классов аля std::string ... |
|||
:
Нравится:
Не нравится:
|
|||
08.06.2020, 23:45 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
AmKad petrav только для классов аля std::string Конечно, любой ресурс с эксклюзивным владением, которое (владение) можно легко передать, забрав у себя. Динамическая память в любом виде, дескриптор файла и т.д. Любой ресурс: сокет, мьютекс (возможно). Там вообще выше какой-то бардак случился. Кое кто перепутал move семантику с emplace(), кто-то предложил не копировать элементы массива, а переносить. Кто-то даже сказал, что move семантика она для многопоточности... пока один поток пишет, то другой переносит. Короче, там выше бардак. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 00:12 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
petrav, А с чего Вы взяли, что у Вас в исходном варианте в первом посте происходит копирование? Вызов-то resize без второго параметра. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 00:49 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
AmKad petrav, А с чего Вы взяли, что у Вас в исходном варианте в первом посте происходит копирование? Вызов-то resize без второго параметра. Наверное потому что если не хватит зарезервированного пространства под новый размер, то вектор придётся (возможно) копировать в другую область памяти? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 00:58 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
petrav AmKad petrav, А с чего Вы взяли, что у Вас в исходном варианте в первом посте происходит копирование? Вызов-то resize без второго параметра. Наверное потому что если не хватит зарезервированного пространства под новый размер, то вектор придётся (возможно) копировать в другую область памяти? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 01:02 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
petrav, Я понял, почему Вам предложили вектор указателей, но не понял, почему Вы вместо этого выбрали указатель на вектор. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 01:11 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
AmKad petrav пропущено... Наверное потому что если не хватит зарезервированного пространства под новый размер, то вектор придётся (возможно) копировать в другую область памяти? Да, но компилятор, когда компилирует вызов resize(), он-то об этом не знает и начинает компилировать что-то наподобие цикла с operator placement new передавая туда результат std::move(). Я могу ошибаться (и ошибаюсь скорее всего) в деталях. Но смысл в том что в resize() содержится цикл копирования. И компиляция ломается на этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 01:12 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
petrav, resize без второго параметра помимо перемещения/копирования существующих объектов еще предполагает и создание новых объектов с вызовом дефолтного конструктора. А он у Вас в protected, а это запрещает создание объекта этого класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 01:23 |
|
Размещение в контейнерах STL не копируемых объектов
|
|||
---|---|---|---|
#18+
AmKad petrav, resize без второго параметра помимо перемещения/копирования существующих объектов еще предполагает и создание новых объектов с вызовом дефолтного конструктора. А он у Вас в protected, а это запрещает создание объекта этого класса. Потому что это цитирование боевого кода (это базовый класс) и, да... я просто не очень хорошо оформил свой первый пример кода. Но во втором моём примере кода эта проблема уже была исправлена. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2020, 01:28 |
|
|
start [/forum/topic.php?fid=57&msg=39967211&tid=2017380]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 263ms |
total: | 400ms |
0 / 0 |