crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Конструкто копирования
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Влад Дата 15.6.2010, 15:31
  kwisp:
У меня экспериментальные результаты таковы:

GCC 4.5 (и 4.4 тоже) выдает
1). 2
2). 0
как в режиме Debug, так и в режиме Release.

В отличие от него, MS Visual C++ 2005
в режиме Debug:
1). 2
2). 1
в режиме Release:
1). 2
2). 0

Litkevich Yuriy Дата 15.6.2010, 13:32
 
Цитата(kwisp @ 15.6.2010, 14:19) *
проверял?
нет

видимо во втором случае, локальный объект не уничтожается, ради экономии времени и памяти, а просто возвращается ссылка на него.
kwisp Дата 15.6.2010, 12:52
  Влад,
вот и хотелось бы разобраться и с компилятором и с опциями оптимизации.

у меня на деле
1) 2
2) 0
!

П.С.
ну и чисто риторически как к примеру человеку не знакомому с С++ доказать и показать на практике как и что происходит. вот к примеру школьникам.

gcc версия 4.3.4
Влад Дата 15.6.2010, 12:36
  Юрий совершенно прав. Теоретически должно быть именно так.
На практике, однако, компилятору разрешено проводить RVO, поэтому реальные результаты могут отличаться от ожидаемых. Впрочем, это сильно зависит как от компилятора, так и от опций оптимизации. В чем же тогда смысл вопроса?
kwisp Дата 15.6.2010, 10:19
  Litkevich Yuriy,
проверял?
Litkevich Yuriy Дата 14.6.2010, 16:43
  1) 2
2) 1
kwisp Дата 14.6.2010, 14:20
 
# ifndef _PARENT_H_
# define _PARENT_H_


class Parent
{      

protected:
int m_id;

public:
        Parent():m_id(0)
        {
                std::cout<<__PRETTY_FUNCTION__<<"\n";
        }
        Parent(const int & id):m_id(id)
        {
                std::cout<<__PRETTY_FUNCTION__<<"\n";
        }
        Parent(const Parent& parent):m_id(parent.m_id)
        {
                std::cout<<__PRETTY_FUNCTION__<<"\n";
        }
        void setId(const int& id) {m_id = id;}
        Parent& operator=(const Parent& parent)
        {
                this->m_id = parent.m_id;
                std::cout<<__PRETTY_FUNCTION__<<"\n";
                return *this;
        }
};

# endif // _PARENT_H_

# include <iostream>
# include "parent.h"

Parent setParent(Parent parent)
{
        return parent;
}

Parent getParent(const int& i)
{
        Parent p(i);
        return /*Parent(i)*/p;
}

int main()
{
        //Parent parent(10);
        //setParent(parent);
        //parent = getParent(11);
        //return 0;
}

внимание вопросы:
1. сколько раз при вызове setParent(parent) вызовется конструктор копирования?
2. сколько раз при вызове getParent(11) вызовется конструтор копирования?

П.С.
если прилагаете к ответу консольный вывод программы указывайте пожалуйста версию компилятора и ОС.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 20.4.2024, 0:04