Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.06.2012, 10:51   #1
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию Вызовы конструктора копирования

Возник теоретический вопрос: допустим, есть следующий код (члены-данные в разделе public находятся для простоты):
Код:
class A
{
public:
    int x;
    A(int v): x(v) {}
    A(A& src)
    {
         x = src.x;
         cout<<"copy"<<endl;
    }
}
A operator+(A a1, A a2)
{
    A res = a1.x + a2.x;
    return res;
}
void main()
{
    A a = 1;
    A b = 2;
    A c = a+b;
}
Конструктор копирования должен вызываться 4 раза: 2 раза при передаче объектов по значению, 1 раз при возврате из функции по значению, и 1 раз при инициализации объекта типа А другим объектом. Но он вызывается всего 3 раза. Почему?
rmv240899 вне форума Ответить с цитированием
Старый 11.06.2012, 11:45   #2
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

запретите компилятору оптимизировать и будет вам 4.
f.hump вне форума Ответить с цитированием
Старый 11.06.2012, 11:56   #3
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

Оптимизация выключена, но все равно 3.
rmv240899 вне форума Ответить с цитированием
Старый 11.06.2012, 12:14   #4
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

че-то не посмотрел, что вообще происходит

a1 = a
a2 = b

res = x

c = res

зы
если правильно понимаю, то с оптимизацией должно быть 2
f.hump вне форума Ответить с цитированием
Старый 11.06.2012, 12:22   #5
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
зы
если правильно понимаю, то с оптимизацией должно быть 2
Почему 2? 2 - при передаче в функцию по значению, 1 - при возврате из функции, и ещё 1 - при инициализации. Но получается, что 3. Тогда что компилятор оптимизирует, что получается 3?
rmv240899 вне форума Ответить с цитированием
Старый 11.06.2012, 12:29   #6
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

ну, я про отимизацию ничего не утверждаю. все зависит от того насколько умный компилятор, самое простое, на мой взляд, что он может сделать, так это не создавать res, соответственно на одно копирование будет меньше.

кстати,
Цитата:
1 - при возврате из функции
вот этого у вас нет вовсе.

Последний раз редактировалось f.hump; 11.06.2012 в 12:46.
f.hump вне форума Ответить с цитированием
Старый 11.06.2012, 12:36   #7
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

Цитата:
Сообщение от f.hump Посмотреть сообщение
кстати, вот этого у вас нет вовсе.
Как это нет? В операторе + есть строка return res.
rmv240899 вне форума Ответить с цитированием
Старый 11.06.2012, 12:40   #8
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

и что эта строка по вашему мнению делает?

я уже в четвертом посте написал, что происходит:
два копирования
инициализация целым
инициализация референсом
f.hump вне форума Ответить с цитированием
Старый 11.06.2012, 12:53   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Присоединяюсь к вопросу. С выключенными оптимизациями всего три конструктора копии.

Так же, вношу дополнительный вопрос:
1. Пропущена точка с запятой после декларации класса. Ну это фигня.

2. Копирующий конструктор принимает на входе не_константный объект по ссылке.

Таким образом:

Код:
void main()
{
    A a = 1;
    A b = 2;
    //A c = a+b;
    a+b;
}
Мы по прежнему имеем 2 конструктора с оптимизацией, и 3 без оптимизации.
Но из примера видно, что a+b дают временный объект, который по стандарту является константным

Но класс не располагает конструктором копии, принимающий на входе константный объект по ссылке!

Таким образом, в коде:

Код:
void main()
{
    A a = 1;
    A b = 2;
    A c = a+b; //срабатывает конструктор, который принимает не константную ссылку
    //a+b;
}
Функция принимает не_константную ссылку на объект, который является константным.

Почему компилятор такое пропускает?

Последний раз редактировалось _Bers; 11.06.2012 в 12:55.
_Bers вне форума Ответить с цитированием
Старый 11.06.2012, 12:59   #10
f.hump
C/C++, Asm
Участник клуба
 
Аватар для f.hump
 
Регистрация: 02.03.2010
Сообщений: 1,323
По умолчанию

Цитата:
Почему компилятор такое пропускает?
потому что это был
Цитата:
теоретический вопрос
f.hump вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Системные вызовы Linux| C Демик Помощь студентам 1 16.04.2012 23:29
Вызов конструктора для this в констукторе копирования TrydORgolik Общие вопросы C/C++ 1 03.09.2011 11:54
Макрос для копирования значений из нескольких файлов в один общий с определенным условием копирования zenner Microsoft Office Excel 0 21.03.2011 14:48
Автоматическое преобразование на основе первого аргумента конструктора в вызов самого конструктора jennya Visual C++ 8 03.10.2010 19:03
Системные вызовы... bek@rt Win Api 2 03.05.2007 02:48