Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
OoCcГлупости. В каком месте? OoCcв 99% случаях замена вектора на декъю решает все проблемы с внутренними перемещениями и лишними обьектами. Да, дек лишён некоторых недостатков вектора -- вставки в начало и в конец не инвалидируют итераторы, так же как и удаление, так как в памяти он хранится в виде двумерного массива, а не полностью непрерывно, как вектор. Однако тут сразу встаёт вопрос со вставкой элемента в середину, а также вопрос кэширования данных дека CPU. Так что, ни то, ни другое -- не панацея, везде надо искать компромиссы для своего конкретного случая. И в случае с вектором из ваших классов можно значительно уменьшить накладные расходы на реаллокацию реализовав правильно move-конструктор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.04.2018, 08:53 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
NekZИли можно сделать noexcept move-конструктор. Именно такой будет вызываться при реаллокации вектора, если существует, взамен конструктору копирования.При релокации вектора (при исчерпании зарезервированного места) вызываются конструкторы? Не верю. Для "пользователя" это вообще невидимое событие, чисто технически необходимое, перенос куска памяти (набора указателей в случае вектора) в новое место. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 05:20 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
CEMbПри релокации вектора (при исчерпании зарезервированного места) вызываются конструкторы? Не верю. Для "пользователя" это вообще невидимое событие, чисто технически необходимое, перенос куска памяти (набора указателей в случае вектора) в новое место. Ну приехали... Может, стоило хотя бы проверить? Просто запусти этот код и проверь (обещаю, он не майнит биткойны): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. У меня получился такой вывод: capacity=0 S() capacity=1 S() S(S const &) capacity=2 S() S(S const &) S(S const &) capacity=4 Program ended with exit code: 0 Попробуй объяснить каждую строчку вывода. Имеем три вызова дефолтного конструктора и три вызова конструктора копирования. А потом, если ты просто добавишь noexcept к move-конструктору, то будет вызываться именно он: capacity=0 S() capacity=1 S() S(S &&) capacity=2 S() S(S &&) S(S &&) capacity=4 Program ended with exit code: 0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 07:18 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
NekZПросто запусти этот код и проверь А, блин, я понял, в чём дело (но успел посмотреть код под двумя компиляторами), ну да, всё верно, там потому что в векторе хранятся объекты. Поэтому при релокации, stl будет их переносить, потому что по-другому просто не умеет. А если std::move есть, то да, можно и не переносить (к чему и стремились), потому что сами объекты по сути не меняются. я не заметил подвох потому что обычно так: vector<S> не делаю (а стоило, видимо. "В жизни нужно попробовать всё") единственное, прошу разъяснить, как noexcept влияет на выбор конструктора. У меня (С++11) без noexept вызывался move-конструктор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 13:48 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
CEMbединственное, прошу разъяснить, как noexcept влияет на выбор конструктора. У меня (С++11) без noexept вызывался move-конструктор. ЕМНИП, не noexcept move-конструктор будет вызываться только тогда, когда нет вообще доступного конструктора копирования и есть явно заданый move-конструктор без noexcept'а. То есть, приоритет выбора такой, сверху вниз: 1. noexcept move-ctor 2. copy-ctor 3. move-ctor 4. error ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 14:28 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
CEMbтам потому что в векторе хранятся объекты. Логично. Для POD-типов, включая сырые указатели, ты не переопределишь move-конструктор. В таких случаях, вектор просто делает memmove, что как бы намекает ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.05.2018, 14:31 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
NekZЛогично.Логично то, что один раз закинув объект в вектор, я не должен ожидать повторный вызов конструктора для него, так как сам я объект не перемещаю, да и при растяжении вектора объект перемещаться не должен в идеале. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2018, 07:38 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
CEMbпри растяжении вектора объект перемещаться не должен в идеале. Как тогда можно увеличить размер вектора, сохранив последовательное расположение его элементов в памяти? Чудес не бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2018, 07:49 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
CEMbNekZЛогично.Логично то, что один раз закинув объект в вектор, я не должен ожидать повторный вызов конструктора для него, так как сам я объект не перемещаю, да и при растяжении вектора объект перемещаться не должен в идеале. Может, тогда тебе нужен другой контейнер, например, std::list? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2018, 08:17 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
NekZМожет, тогда тебе нужен другой контейнер, например, std::list?да не, я просто в векторах указатели/POD храню, так что всё ок. Но я действительно не ожидал, что будет вызываться конструктор при переносе внутренностей вектора. Почему бы не перенести байт-в-байт данные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2018, 08:37 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
CEMbПочему бы не перенести байт-в-байт данные? Например там может быть указатель на буфер внутри объекта. Недавно обсуждали глюк с std::string . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2018, 08:43 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
CEMbда не, я просто в векторах указатели/POD храню, так что всё ок. Тогда ты всё равно должен помнить, что если хранишь умные указатели в векторе, у них, скорее всего, иногда вызывается move-ctor ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.05.2018, 19:46 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
CEMbя просто в векторах указатели/POD храню ну а сами объекты размещаются на куче черти где, и последовательный перебор будет со скоростью работы памяти(раза в 3-4 медленнее, чем могло бы)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.05.2018, 10:28 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
NekZдолжен помнитьда, теперь буду! alex_kну а сами объекты размещаются на куче черти где, и последовательный перебор будет со скоростью работы памяти(раза в 3-4 медленнее, чем могло бы)?надо проверить. По идее, не сильно медленнее должно быть, что стек, что куча? В случае с кучей просто ещё одна операция разыменования (а я обычно в начале цикла сразу беру указатель с итератора и работаю уже с ним), и всё упирается в то, как мы работаем с объектом. Ну, идеального решения на все случаи в плюсах нету. Если вектор часто переносится - выгоднее, видимо, держать указатели. Если нет - объекты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 05:14 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
CEMbalex_kну а сами объекты размещаются на куче черти где, и последовательный перебор будет со скоростью работы памяти(раза в 3-4 медленнее, чем могло бы)?надо проверить. По идее, не сильно медленнее должно быть, что стек, что куча? В случае с кучей просто ещё одна операция разыменования (а я обычно в начале цикла сразу беру указатель с итератора и работаю уже с ним), и всё упирается в то, как мы работаем с объектом. Ну, идеального решения на все случаи в плюсах нету. Если вектор часто переносится - выгоднее, видимо, держать указатели. Если нет - объекты. Тут, наверное, имелся в виду перенос данных в кэши процессора, когда ты последовательно обращаешься к непрерывному куску памяти, что намного ускоряет выполнение кода. А когда данные по памяти разбросаны по указателям, то прироста скорости не жди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2018, 12:08 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
NekZА когда данные по памяти разбросаны по указателям, то прироста скорости не жди.в случае, когда вектор шибко динамический, без указателей, но с большими объектами, то прирост скорости может и быть за счёт переноса только указателей, а не объектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2018, 05:27 |
|
||
|
Помогите не понимаю
|
|||
|---|---|---|---|
|
#18+
CEMbNekZА когда данные по памяти разбросаны по указателям, то прироста скорости не жди.в случае, когда вектор шибко динамический, без указателей, но с большими объектами, то прирост скорости может и быть за счёт переноса только указателей, а не объектов. Это очень тонкий трейд-оф ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.05.2018, 17:53 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2017868]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
9ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 170ms |

| 0 / 0 |
