Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
MasterZivDima Trdb_dev, в этой книжке Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14 написано как устроен std::move. Он "работает" во время компиляции. Он просто ссылку преобразует в rvalue-ссылку, если это возможно.Мне больше нравится, как сказано у самого Мейерса: std::move преобразует в rvalue (без "-ссылку"). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 15:20 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
semen.s.semenПривидите пожалуйста Ваш корректно работающий вариант кода с использованием std::move ИМХО лучше почитай об этом в книге Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14 Там понятным языком разжевано что такое std::move и что надо прописать в классе чтобы он работал. Читать немного, 10-20 страниц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 15:25 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
MasterZivИ зачем ты туда new всобачил? Чтобы запутать ещё больше?Не понял вопроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 15:27 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
Dima Trdb_dev, в этой книжке Эффективный и современный С++. 42 рекомендации по использованию C++11 и C++14 написано как устроен std::move. Он "работает" во время компиляции.Как еще должен "работать" обычный шаблон, как не во время компиляции? И причем тут, вообще, шаблон std::move? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2018, 16:32 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
rdb_devненаследованные (собственные) члены конструктор копирования по умолчанию может и обычным копированием сделать через MOVSB, задав в регистрах #SI и #DI источник и приемник соответственно НЕ НАДО так делать! В случае с копированием двух объектов одного класса может быт ещё ничего плохого не произойдёт, но в общем случае можно закосячить объект. Во-первых, в объект входит указатель на виртуальную таблицу методов, если есть (это MS) Во-вторых, если есть родительские методы, то &x и реальное начало данных x могут отличаться. Плюс ещё оптимизатор, вроде, может чего-нить местами переставить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 05:28 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
CEMbВо-первых, в объект входит указатель на виртуальную таблицу методов, если есть (это MS) Плюс ещё оптимизатор, вроде, может чего-нить местами переставить.Собственно, указатель this, это указатель на указатель на таблицу виртуальных методов - это еще в Borland TASM было. CEMbВо-вторых, если есть родительские методы, то &x и реальное начало данных могут отличаться.Не может! У экземпляра класса есть лишь одна таблица виртуальных методов, которая хранится отдельно от экземпляра класса и все экземпляры одного и того же класса имеют один и тот же указатель на таблицу виртуальных методов. При наследовании, компилятор создает копию родительской таблицы виртуальных методов и добавляет в конец этой копии указатели на виртуальные методы наследника в порядке их объявления. Конец таблицы виртуальных методов определяется указателем NULL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2018, 09:43 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
rdb_dev, ну, может на счёт второго я и напутал что-то, я не смог вспомнить пример. Но первого достаточно, чтобы не копировать память вручную. Это потенциальная ошибка, у тебя могут быть пара указателей на класс А, один из которых на самом деле указывает на дочерний класс В. В случае прямого копирования получится неправильный экземпляр. Хотя, интересный хак получается :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 05:15 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
CEMbrdb_dev, ну, может на счёт второго я и напутал что-то, я не смог вспомнить пример. Но первого достаточно, чтобы не копировать память вручную. Это потенциальная ошибка, у тебя могут быть пара указателей на класс А, один из которых на самом деле указывает на дочерний класс В. В случае прямого копирования получится неправильный экземпляр. Хотя, интересный хак получается :)Почему должен получится неправильный экземпляр? Давай рассмотрим простой пример: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. В соответствии с ABI, экземпляр B в памяти будет выглядеть следующим образом (на x86_32 при выравнивании на QWORD): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Поэтому, конструктор копии экземпляра A скопирует именно ту часть, которую должен. Вообще, я предпочитаю объединять члены класса в структуру - так проще копировать, если нет необходимости делать копии того, на что указывают члены-указатели, а для конструктора пересылки это идеальный вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 09:42 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
Недавно обсуждали что std::string нельзя просто скопировать для переноса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 09:56 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
Dima T, конечно, экземпляры чужих классов нехорошо просто копировать, особенно, если не знаешь как они устроены, это ежу понятно! Но создать реализацию конструктора пересылки своего класса, которая будет копировать данные байт-в-байт, а затем подчищать источник - вполне допустимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 10:23 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
rdb_devПочему должен получится неправильный экземпляр?потому что vtable pointer от одного класса перезапишется поверх vtp другого класса. Если использовать this-ы. rdb_devДавай рассмотрим простой пример:а, ты какой хитрый! ты берёшь адрес с переменной. а это ещё хуже, потому что напишешь копировальщик. А потом забудешь, будешь рефакторить и перед a1 поставишь какую-нить другую переменную - и получится трудноуловимая ошибка. Нет, я согласен, так делать можно при должной осторожности . Но я бы лично так не делал. Выгода не понятна, сомневаюсь в наличии таких классов, у которых movsb даст много выигрыша по сравнению с по-переменным копированием. Если в классе есть большие блоки данных (массивы, векторы), у них свой копировальщик. Все остальные копируются вручную. Кстати, а что будет, если shared_ptr так скопировать? Т.е. понятно, что счётчик не увеличится, но что будет когда объект класса содержащего копию этого shared_ptr будет уничтожен? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 11:11 |
|
||
|
2 раза вызывается деструктор
|
|||
|---|---|---|---|
|
#18+
CEMbпотому что vtable pointer от одного класса перезапишется поверх vtp другого класса. Если использовать this-ы.Естественно, копировать указатель на таблицу виртуальных методов не стОит! Он и так нормально проинициализируется. CEMbа, ты какой хитрый! ты берёшь адрес с переменной.Конечно! Что же еще? 😊 CEMbа это ещё хуже, потому что напишешь копировальщик. А потом забудешь, будешь рефакторить и перед a1 поставишь какую-нить другую переменную - и получится трудноуловимая ошибка.Поэтому, я и написал, что предпочитаю засовывать всё мемберы в инкапсулируемую структуру. Её проще копировать и даже можно написать inline конструктор копии или конструктор пересылки такой структуры. CEMbНет, я согласен, так делать можно при должной осторожности . Но я бы лично так не делал. Выгода не понятна, сомневаюсь в наличии таких классов, у которых movsb даст много выигрыша по сравнению с по-переменным копированием. Если в классе есть большие блоки данных (массивы, векторы), у них свой копировальщик. Все остальные копируются вручную.Представь, что у тебя не три и не четыре члена, размером не более размерности регистра платформы, которые компилятор может распихать в регистры EAX, EDX, ECX, EBX, а гораздо больше и, к примеру, все long long, а приложение 32-х разрядное. Я пихаю все члены в структуру, чтобы не пропустить в конструкторе копии или пересылки какой-нибудь член, а гарантировано всё скопировать. Для конструктора пересылки это вполне нормальный подход, так как после копирования можно просто заполнить структуру источника нолями, что позволит обнулить и указатели, чтобы деструктор не освободил данные, которыми уже владеет объект-приемник. CEMbКстати, а что будет, если shared_ptr так скопировать? Т.е. понятно, что счётчик не увеличится, но что будет когда объект класса содержащего копию этого shared_ptr будет уничтожен?Не надо просто копировать shared_ptr - он на это не расчитан. Другое дело, если ты создаешь свой собственный класс safe-thread смарт-указателя и чтобы при возврате его как rvalue через стек не дёргать каждый раз переменную подсчёта ссылок в синглетоне через медленные атомарные операции работы с памятью, ты можешь написать конструктор пересылки, который будет лишь копировать данные из источника и обнулять источник. Но это при условии, что синглетон типа не содержит реализацию реферальных ссылок на смарт-указатели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2018, 12:18 |
|
||
|
|

start [/forum/topic.php?fid=57&gotonew=1&tid=2017880]: |
0ms |
get settings: |
11ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
30ms |
get topic data: |
8ms |
get first new msg: |
6ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 301ms |
| total: | 427ms |

| 0 / 0 |
