![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 16.01.2010
Сообщений: 8
|
![]()
Здравствуйте, Господа!
Есть вопрос. Использую Microsoft Visual C++ 2005. Пишу код: Код:
Konstr 45 Destr Destr Добавляю копирующий конструктор в класс путём удаления коменнтария: Код:
На экране вижу: Konstr 45 Destr Вопрос. Почему без копирующего конструктора временный объект создаётся, а при его включении в класс, временный объект не создаётся? Последний раз редактировалось MaTBeu; 16.01.2010 в 18:09. |
![]() |
![]() |
![]() |
#2 |
Linux C++ Qt ARM
Старожил
Регистрация: 30.11.2008
Сообщений: 3,030
|
![]()
А нельзя-ли просто передать ссылку на объект?
Дилетант широкого профиля.
"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс |
![]() |
![]() |
![]() |
#3 |
JAVA BEAN
Участник клуба
Регистрация: 22.04.2007
Сообщений: 1,329
|
![]()
В функцию объекты должны передаваться либо через ссылку, либо через константную ссылку. Передача копии бессмысленна и тратит много времени.
|
![]() |
![]() |
![]() |
#4 |
Регистрация: 16.01.2010
Сообщений: 8
|
![]()
Да, я всё это понимаю, но ваш ответ не отменяет моего вопроса.
|
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,087
|
![]() Цитата:
![]() А это уже зависит от выполняемой задачи. Такое жесткое табу ставить не стоит. Если я хочу реализовать длинное целое и чтобы в коде этот MyLongInt вёл себя как int, long,... то, почему бы его не копировать, передавая в функции по значению? Опять же можно реализовать разрушающее копирование (см. auto_ptr). Да и в целом в передаче объектов по значению(т.е. их неявному копированию) ничего плохого нет (если конечно это дело используется с умом). |
|
![]() |
![]() |
![]() |
#6 |
Форумчанин
Регистрация: 07.01.2010
Сообщений: 141
|
![]()
Возможно это какое-то хитрое правило, но больше похоже на хитрую оптимизацию, которую компилятор в состоянии сделать при определенных условиях. При каких - я не знаю.
Есть например 'оптимизация возвращаемого значения', она же RVO с той лишь разницей, что там исключаются лишние копирования на выходе из функций. Вот там что-то очень похожее. Загляните в статейку по RVO, может наведет на какие-нибудь мысли: http://alenacpp.blogspot.com/2008/02/rvo-nrvo.html Последний раз редактировалось _Ч_; 17.01.2010 в 15:18. |
![]() |
![]() |
![]() |
#7 |
Регистрация: 16.01.2010
Сообщений: 8
|
![]()
Спасибо большое. Уже что-то проясняется. Но ваша ссылочка к сожалению не открылась почему-то. Оптимизация связанная со стеком программы, наверное. В одном случае обьект копируется в стек, для передачи в функцию, т.е создаётся временный объект, в другом случае объект создаётся в самой функции.
|
![]() |
![]() |
![]() |
#8 |
Форумчанин
Регистрация: 07.01.2010
Сообщений: 141
|
![]()
хм. вроде открывается.
ну попробуйте в яндексе RVO набрать. первая же ссылка как раз ссылка на эту статью. |
![]() |
![]() |
![]() |
#9 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,087
|
![]()
Это больше похоже на особенность/баг оптимизатора. gcc в обоих вариантах копию не создаёт, как и должно быть по идее.
|
![]() |
![]() |
![]() |
#10 |
Форумчанин
Регистрация: 13.12.2009
Сообщений: 272
|
![]()
А как по мне - тут самое удивительное, что конструктор вызывался меньше раз, чем деструктор о_О
Если я помог вам - порадуйте меня, нажмите на весы слева
![]() |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Си++. Передача массива в функцию. | Diamond2107 | Помощь студентам | 7 | 03.12.2009 20:15 |
Передача поля объекта в процедуру в качестве параметра | Голованов Д. | Microsoft Office Excel | 10 | 02.11.2009 16:22 |
Передача массива в функцию | D[I]K | Общие вопросы C/C++ | 4 | 13.09.2009 21:31 |
передача массива в функцию | JOFRIF | Общие вопросы C/C++ | 8 | 02.08.2009 12:46 |
Передача массива в функцию | Vistar | Общие вопросы C/C++ | 1 | 27.04.2009 08:08 |