|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
||||||
Почему не вызывается конструктор копирования?05.11.2010, 21:40. Показов 12891. Ответов 53
Метки нет (Все метки)
...У меня в книге описаны случаи при которых вызывается конструктор копирования. Один из этих случаев:
: "Когда аргумент имеет тип класса. Создаётся копия аргумента и затем передаётся в функцию" Ну-с попробуем смоделировать такую ситуацию:
Спасибо заранее
0
|
||||||
| 05.11.2010, 21:40 | |
|
Ответы с готовыми решениями:
53
Почему не вызывается конструктор копирования при возврате объекта из функции
Когда вызывается конструктор копирования? |
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 12.05.2011, 12:22 | |
|
Повторяю, в твоём коде нет смысла создавать временный объект. Вместо создания "arr obj" с последующим копированием в "arr x", сразу же создаётся "arr x". Т.е. не происходит побитового копирования, создаётся всего один объект и ничего копировать не нужно.
Я привёл тебе варианты, когда одним объектом обойтись нельзя и копирование будет происходить. Почитай про оптимизации, которые делает твой компилятор, ты будешь оооочень удивлён. Я серьёзно. Он ведь и количество аргументов у функций менять может и порядок операций менять, много чего может. И всё это не сказывается на результате. Так же, как на результате не сказывается удаление промежуточного объекта.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
||||||||||||
| 12.05.2011, 12:38 [ТС] | ||||||||||||
всё-таки obj создастся? И не будет скопирован (как я хочу посимвольно), и будет уничтожен и будет вызван его деструктор? Добавлено через 7 минут В конце концов, чё это я, надо было сразу так написать:
И эта ситуация часта.
0
|
||||||||||||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 12.05.2011, 12:39 | |
|
Функция вызовется, да. Но вывод в консоль никак не связан с объектов obj. Я это вижу, компилятор это видит. И он может его здесь не создавать и не копировать. У тебя слишком простой пример, который компилятор слишком хорошо оптимизирует.
Ты пойми, весь ненужный код оптимизатор по возможности убирает, а тут копирование излишне.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 12.05.2011, 12:41 [ТС] | |
|
Ну я там добавил, посмотри
...Да я уже понял, что копилятор не вызовет мой конструктор. Я благодарен ему и восхищаюсь его умению самому принимать решения. ...Но лучше бы он этого не делал, ибо результат- указывание указателя на несуществующую строку. А это посерьёзнее чем просто невывод диагностической надписи "вызван конструктор копирования". Это полная ж...а
0
|
|
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||
| 12.05.2011, 12:42 | ||
|
Я уже писал, отключи оптимизации.
0
|
||
|
2924 / 1274 / 114
Регистрация: 27.05.2008
Сообщений: 3,465
|
||
| 12.05.2011, 12:49 | ||
|
2
|
||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||||||
| 12.05.2011, 12:58 | ||||||
|
Кроме того, оператор присваивания не обязан работать через конструктор копирования. И кроме момента создания объекта, он не будет заменён на конструктор копирования.
Добавлено через 2 минуты Кстати, в MSDN есть пример про удаление промежуточного объекта:
0
|
||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|||
| 12.05.2011, 13:36 [ТС] | |||
|
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
||||||||||||
| 12.05.2011, 13:39 [ТС] | ||||||||||||
0
|
||||||||||||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|||
| 12.05.2011, 14:01 | |||
|
http://msdn.microsoft.com/en-u... 80%29.aspx
Уж не знаю, как объяснить проще, чем там написано. Своими словами не удалось, попробую ихними. Все претензии к Майкрософту, что они удаляют ненужный код.) Добавлено через 1 минуту Значит, этот код настолько очевиден для компилятора, что он даже при выключенных оптимизациях от него избавляется.) Запусти под дебагом, там точно всё будет, как тебе хочется.
0
|
|||
|
|
|
| 12.05.2011, 14:08 | |
|
kravam, если одни объекты имеют одинаковое состояние (они полные копии друг друга) и не изменяются на протяжении какого-то участка времени, то компилятор вполне может использовать для разных казалось бы объектов одну область памяти. Чтобы они были по настоящему разными - надо их изменять и тогда компилятор будет вынужден создавать копии.
Тоже самое касательно создания/несоздания объектов. Если объект никак не используется, то компилятор может его вообще не создавать. Чтобы обязать компилятор выполнять вообще все описанные программистом действия, то надо помечать переменную как volatile.
1
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 12.05.2011, 14:09 [ТС] | |
|
А как под дебагом запускать?
А вообще вот, я нашёл: (GCC._Полное_руководство_(Гриффитс)) -felide-constructors Действует по умолчанию. Упрощает rенерируемый код, если он вызывает функ цию, возвращающую объект значением ero адреса. В результате оптимизации фун кция создает экземпляр объекта непосредственно в указанном расположении воз вращаемоrо значения вместо использования конструктора копирования объекта, созданноrо внутри локальной области действия функции. Это может вызывать проблемы в случае, если конструктор оказывает побочное действие на результат. Отменить значение флаrа по умолчанию можно применением обратной опции -fno-elide-constructors Получилось. Ужасно. ![]() ............................. Всем спасибо.
1
|
|
|
|
||||||||||||||||||||||
| 12.05.2011, 18:12 | ||||||||||||||||||||||
|
Тоже заинтересовался этим делом, решил посмотреть дизасемблированный вид вот этого кода:
![]() Добавлено через 41 минуту
Добавлено через 2 минуты пробовал так:
0
|
||||||||||||||||||||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 12.05.2011, 18:49 [ТС] | |
|
g++ -fno-elide-constructors
тогда по возврату из функции вызовется КК (...Правда, я не знаю, какой у Вас компилятор.)
0
|
|
| 12.05.2011, 18:57 [ТС] | |
|
Не по теме: Знакомый порыв...
0
|
|
|
2383 / 1667 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|||||
| 27.06.2011, 00:51 | |||||
|
Придумать ситуацию, когда RVO принесёт вред наверное можно, но очень не просто.
0
|
|||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|
| 27.06.2011, 01:17 [ТС] | |
|
Не стоит повторять. Там было уже сказано, что в данном примере (слишком простом) копирование излишне и так далее. И вообще.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,709
|
|||||||||||
| 21.08.2011, 22:35 [ТС] | |||||||||||
|
...Возвращаясь к этой теме хочется отметить смешное поведение компилятора g++
Итак, мы договорились, что компилятор умный и не вызывает КК без надобности. ...Итак, все опции по умолчанию. Пишем свой КК- он не вызывается (это обсуждено). Но вот когда мы его убираем, встроенный КК вызывается (А знаю я это откуда? А по адресам смотрю...)! То есть ситуация та же самая- просто тупо скопировать побайтно объект не содержащий никаких указателей ни никакие строки но КК вызывается. Кроме смеха из этого можно извлечь урок: если хочешь, чтобы КК не вызывался- НАПИШИ ЕГО. если хочешь, чтобы КК вызывался- НЕ ПИШИ ЕГО Именно так, я ничё не придумал. Компилим и смотрим на адреса. А потом расскоментиваем эту строчку
0
|
|||||||||||
|
Freelance
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
|
|
| 21.08.2011, 22:44 | |
|
0
|
|
| 21.08.2011, 22:44 | |
|
Сколько раз вызывается конструктор копирования В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса? Почему не вызывается конструктор перемещения? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Транслитерация текста с кириллицы на латиницу (вариант №3)
Maks 15.11.2026
Обновленная версия предыдущей обработки.
Изменения коснулись букв: Ъ, Ы, Ь, Э, отображения которых зависят от положения реквизита "Транслитерация имён".
Изменено отображение буквы Й.
Добавлена. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки.
Добавлено:
- Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
|
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы.
Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
|
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
|
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|