|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||
Почему не вызывается конструктор копирования?05.11.2010, 21:40. Показов 12087. Ответов 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,705
|
||||||||||||
| 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,705
|
|
| 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,705
|
|||
| 12.05.2011, 13:36 [ТС] | |||
|
0
|
|||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
||||||||||||
| 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,705
|
|
| 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,705
|
|
| 12.05.2011, 18:49 [ТС] | |
|
g++ -fno-elide-constructors
тогда по возврату из функции вызовется КК (...Правда, я не знаю, какой у Вас компилятор.)
0
|
|
| 12.05.2011, 18:57 [ТС] | |
|
Не по теме: Знакомый порыв...
0
|
|
|
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
|
|||||
| 27.06.2011, 00:51 | |||||
|
Придумать ситуацию, когда RVO принесёт вред наверное можно, но очень не просто.
0
|
|||||
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|
| 27.06.2011, 01:17 [ТС] | |
|
Не стоит повторять. Там было уже сказано, что в данном примере (слишком простом) копирование излишне и так далее. И вообще.
0
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
|
|||||||||||
| 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 | |
|
Помогаю со студенческими работами здесь
40
Сколько раз вызывается конструктор копирования В каких случаях вызывается конструктор копирования, и стоит ли вообще об этом думать? Будет ли утрачена память, когда конструктор копирования вызывается для уже существующего объекта класса? Почему не вызывается конструктор перемещения? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Оттенки серого
Argus19 18.03.2026
Оттенки серого
Нашёл в интернете 3 прекрасных модуля:
Модуль класса открытия диалога открытия/ сохранения файла на Win32 API;
Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
|
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-rectangles-sdl3-c. zip
finish-rectangles-sdl3-cpp. zip
|
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие.
Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
|
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ВВЕДЕНИЕ
Выполняя задание на управление насосной группой заполнения резервуара,. . .
|
|
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|