Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[13.58.185.199] |
|
Страницы: (32) « Первая ... 26 27 [28] 29 30 ... Последняя » ( Перейти к последнему сообщению ) |
Сообщ.
#406
,
|
|
|
Цитата OpenGL @ Выделяется память, создаётся элемент в нужном месте, перемещаются или копируются элементы из старого массива, вызываются деструкторы, освобождается память. Как-то так. Какой–то тяжеловатый реаллок получается. Неужели он так и работает? Я почему–то думал, что он просто бинарные данные копирует. |
Сообщ.
#407
,
|
|
|
Цитата Олег М @ Цитата OpenGL @ Выделяется память, создаётся элемент в нужном месте, перемещаются или копируются элементы из старого массива, вызываются деструкторы, освобождается память. Как-то так. Какой–то тяжеловатый реаллок получается. Неужели он так и работает? Я почему–то думал, что он просто бинарные данные копирует. Как ты собрался копируя бинарные данные обеспечить корректность работы объектов? Добавлено В случае, если у тебя noexcept конструкторы перемещения, то он сможет сделать перемещение, а не копирование. |
Сообщ.
#408
,
|
|
|
Цитата JoeUser @ Скажем так: для чего применять этот принцип, это уже неважно. Вот такая строчка:И, тем не менее, помогать компилятору помогать тебе контролировать тебе свои типы - нехорошая черта (типизированного) языка. extern int static_check[(INT_MAX+INT_MIN == -1)*2-1]; SFINAE в первую очередь позволяет писать обобщённый код, как и перегрузка позволяет статические мультиметоды. Выкинь вон ту "SFINAE"-вую фичу из перегрузки, и она станет совершенно бесполезной вещью. Классы тоже предназначены для ООП, а используются для ООП дай бог чтоб в половине случаев. |
Сообщ.
#409
,
|
|
|
Цитата D_KEY @ Как ты собрался копируя бинарные данные обеспечить корректность работы объектов? В большинстве случаев не вижу проблем |
Сообщ.
#410
,
|
|
|
Цитата Олег М @ Цитата D_KEY @ Как ты собрался копируя бинарные данные обеспечить корректность работы объектов? В большинстве случаев не вижу проблем Как бы ты реализовал переаллокацию для вектора? Сделаешь побитовое копирование? И как ты будешь определять, сломаешь ли ты клиенту его объекты или нет? Добавлено Да и вообще, побитово копировать объекты, для которых пользователь задал конструктор копирования/переноса как-то странно, тебе не кажется? |
Сообщ.
#411
,
|
|
|
Цитата D_KEY @ Как бы ты реализовал переаллокацию для вектора? Сделаешь побитовое копирование? И как ты будешь определять, сломаешь ли ты клиенту его объекты или нет? Добавлено Вчера, 15:05 Да и вообще, побитово копировать объекты, для которых пользователь задал конструктор копирования/переноса как-то странно, тебе не кажется? Ну да, с std::vector ситуация оказалась совсем тяжёлая, в gcc. При каждом выходе за capacity, он выделяет новый массив, с другим адресом, и переносит туда все объекты. Причём предпочтительно использует конструктор копирования. Добавлено Почему, в общем-то понятно, но ни разу не радует |
Сообщ.
#412
,
|
|
|
Цитата Олег М @ А что есть мысли как сделать по-другому? Простой memcpy можно использовать для тривиальных POD-ов, и современные компиляторы достаточно умны, чтобы такие данные перебрасывать простым бинарным копированием.Ну да, с std::vector ситуация оказалась совсем тяжёлая, в gcc. При каждом выходе за capacity, он выделяет новый массив, с другим адресом, и переносит туда все объекты. Причём предпочтительно использует конструктор копирования. Почему, в общем-то понятно, но ни разу не радует И вообще это стандартная реализация и она отлично работает. Capacity при реаллокации рассчитывается с запасом, так что даже при непрерывном росте массива, количество реаллокаций будет расти логарифмически. А если заранее известен размер, то можно сразу удлинить массив до необходимого размера. |
Сообщ.
#413
,
|
|
|
Цитата applegame @ А что есть мысли как сделать по-другому? Простой memcpy можно использовать для тривиальных POD-ов, и современные компиляторы достаточно умны, чтобы такие данные перебрасывать простым бинарным копированием. И вообще это стандартная реализация и она отлично работает. Capacity при реаллокации рассчитывается с запасом, так что даже при непрерывном росте массива, количество реаллокаций будет расти логарифмически. А если заранее известен размер, то можно сразу удлинить массив до необходимого размера. Мысль такая - многие классы можно переносить при помощи простого memcpy, ничего это этого не изменится. Соответственно, память под массив можно смело выделять при помощи realloc. |
Сообщ.
#414
,
|
|
|
Цитата Олег М @ Мысль такая - многие классы можно переносить при помощи простого memcpy, ничего это этого не изменится. А многие нельзя переносить. Как определить, когда можно, а когда нет? Задавать политику переноса/копирования извне? Добавлено Цитата Олег М @ Соответственно, память под массив можно смело выделять при помощи realloc. Тут нужно измерять, стоит ли оно того. Вполне может оказаться, что реальный прирост производительности невелик. Добавлено Цитата Олег М @ При каждом выходе за capacity, он выделяет новый массив, с другим адресом, и переносит туда все объекты. Да, но capasity увеличивается не на один элемент Цитата Причём предпочтительно использует конструктор копирования. Хм. Должен вызывать перемещение, если это возможно (т.е. если у элемента noexcept конструктор перемещения). |
Сообщ.
#415
,
|
|
|
Цитата D_KEY @ А многие нельзя переносить. Как определить, когда можно, а когда нет? Задавать политику переноса/копирования извне? Никак не определять. Использовать в частных случаях Цитата D_KEY @ Тут нужно измерять, стоит ли оно того. Вполне может оказаться, что реальный прирост производительности невелик. Выглядит так, что если для массива std::string не будут каждый вызываться конструкторы копирования, то работать должно быстрее. std::vector и базовые типы, похоже по-одному копирует Добавлено Цитата D_KEY @ Хм. Должен вызывать перемещение, если это возможно (т.е. если у элемента noexcept конструктор перемещения). Быстрее было бы вызвать конструктор по-умолчанию, потом move-конструктор. Но нет, вызывается конструктор копирования. |
Сообщ.
#416
,
|
|
|
Цитата Олег М @ Выглядит так, что если для массива std::string не будут каждый вызываться конструкторы копирования, то работать должно быстрее. std::vector и базовые типы, похоже по-одному копирует Ты всерьёз считаешь, что std::string можно копировать побитово? Нет, серьёзно? |
Сообщ.
#417
,
|
|
|
Цитата Олег М @ Цитата D_KEY @ Хм. Должен вызывать перемещение, если это возможно (т.е. если у элемента noexcept конструктор перемещения). Быстрее было бы вызвать конструктор по-умолчанию, потом move-конструктор. Зачем конструктор по умолчанию вызывать? Цитата Но нет, вызывается конструктор копирования. Или ты не так используешь или баг в компиляторе. |
Сообщ.
#418
,
|
|
|
Цитата Олег М @ Быстрее было бы вызвать конструктор по-умолчанию, потом move-конструктор. Но нет, вызывается конструктор копирования. Ни разу не быстрее. Конструктор по-умолчанию инициализирует поля дефолтными значениями (или тем, что задал программист). А конструктор перемещения - сразу тем, что было в "старом" объекте. В итоге - вместо двух инициализаций - одна. Почувствуй разницу. |
Сообщ.
#419
,
|
|
|
Сообщ.
#420
,
|
|
|
Цитата Flex Ferrum @ Ни разу не быстрее. Конструктор по-умолчанию инициализирует поля дефолтными значениями (или тем, что задал программист). А конструктор перемещения - сразу тем, что было в "старом" объекте. В итоге - вместо двух инициализаций - одна. Почувствуй разницу. Против копирования, думаю, разница будет ощутимая Добавлено Какой компилятор? |