Re: Copy-конструктор - подскажите, что не так?
От: LaptevVV Россия  
Дата: 25.05.07 09:11
Оценка: :))
Здравствуйте, Аноним, Вы писали:

А>Добрый день!


А>Имеется следующий код:


А>
А>class MyClass
А>{       int value;
А>    public:
А>        MyClass(): value(1) {}
А>        MyClass(const MyClass& cl): value(2) {}
А>        void print() { cout << value << endl; }
А>};
А>MyClass func()
А>{   MyClass myVar;
А>    return myVar;
А>}

А>int main(void)
А>{   MyClass mainVar = func();
А>    mainVar.print();
А>    return 0;
А>}
А>


А>Я ожидал, что данная прога выведет результат — 2, т.е. сработает 2-ой конструктор. Но под Линуксом (gcc 3.2) она выдает 1. Компилируя сей код с помощью VS2005 тоже получается 1. Но если в VS отключить оптимизации, то результат — 2.

Вопрос в том, что вперед работает...
Список инициализации или вызов функции...
Очевидно, оптимизация влияет на этот порядок...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Copy-конструктор - подскажите, что не так?
От: Анатолий Широков СССР  
Дата: 25.05.07 09:05
Оценка: +1
А>Я ожидал, что данная прога выведет результат — 2, т.е. сработает 2-ой конструктор. Но под Линуксом (gcc 3.2) она выдает 1. Компилируя сей код с помощью VS2005 тоже получается 1. Но если в VS отключить оптимизации, то результат — 2.

А>Подскажите пожалуйста, что здесь не так?


Cтандарту разрешается выполнять RETURN VALUE OPTIMIZATION, то есть комплилятор может опустить создание временного объекта, а подставить на его место адрес инициализируемого объекта, то есть вместо myVar, компилятор сгенерирует код инициализирующий mainVar.
Copy-конструктор - подскажите, что не так?
От: Аноним  
Дата: 25.05.07 08:56
Оценка:
Добрый день!

Имеется следующий код:

#include <iostream>

using namespace std;

class MyClass
{
        int value;
    public:
        MyClass(): value(1) {}
        MyClass(const MyClass& cl): value(2) {}
        void print() { cout << value << endl; }
};

MyClass func()
{
    MyClass myVar;

    return myVar;
}

int main(void)
{
    MyClass mainVar = func();
    mainVar.print();
    return 0;
}


Я ожидал, что данная прога выведет результат — 2, т.е. сработает 2-ой конструктор. Но под Линуксом (gcc 3.2) она выдает 1. Компилируя сей код с помощью VS2005 тоже получается 1. Но если в VS отключить оптимизации, то результат — 2.

Подскажите пожалуйста, что здесь не так?
Re: Copy-конструктор - подскажите, что не так?
От: Lorenzo_LAMAS  
Дата: 25.05.07 09:02
Оценка:
Компилятору позволено осуществлять оптимизацию, выбрасывая лишнее копирование объекта.
Of course, the code must be complete enough to compile and link.
Re: Copy-конструктор - подскажите, что не так?
От: vasmann  
Дата: 25.05.07 09:03
Оценка:
скорее всего компилятор видит что функция возвращает обьект и не видит смысл делать переприсвоение много раз
так что скорее всего ты работаешь всего с одним обьектом и копи конструктор даже и не вызывался
Да истранный конструктор у тебя вроде он должен был копировать — а так создал другой обьект
Спасибо
Re[2]: Copy-конструктор - подскажите, что не так?
От: Lorenzo_LAMAS  
Дата: 25.05.07 09:06
Оценка:
АШ>Cтандарту разрешается выполнять RETURN VALUE OPTIMIZATION, то есть комплилятор может опустить создание временного объекта, а подставить на его место адрес инициализируемого объекта, то есть вместо myVar, компилятор сгенерирует код инициализирующий mainVar.

И тут еще и NAMED VALUE RETURN OPTIMIZATION
Of course, the code must be complete enough to compile and link.
Re[2]: Copy-конструктор - подскажите, что не так?
От: hVostt Россия http://hvostt.ru
Дата: 25.05.07 13:29
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Компилятору позволено осуществлять оптимизацию, выбрасывая лишнее копирование объекта.


Тут у него поведение копирующего конструктора отличается собственно от копирования.
А если так и задумано кодером? Это только для не переопределенного конструктора копирования такие вольности компилера даже приветствуются...
... << RSDN@Home 1.2.0 alpha rev. 677>>
специализация — удел насекомых... (с) Р. Хайнлайн
Re[3]: Copy-конструктор - подскажите, что не так?
От: Lorenzo_LAMAS  
Дата: 25.05.07 13:30
Оценка:
Здравствуйте, hVostt, Вы писали:

V>Здравствуйте, Lorenzo_LAMAS, Вы писали:


L_L>>Компилятору позволено осуществлять оптимизацию, выбрасывая лишнее копирование объекта.


V>Тут у него поведение копирующего конструктора отличается собственно от копирования.

V>А если так и задумано кодером?

А вот не надо такого задумывать и проблем не будет. Т.е. не надо полагаться на то, что конструктор копирования будет обязательно вызван.
Of course, the code must be complete enough to compile and link.
Re[4]: Copy-конструктор - подскажите, что не так?
От: hVostt Россия http://hvostt.ru
Дата: 25.05.07 13:35
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>>>Компилятору позволено осуществлять оптимизацию, выбрасывая лишнее копирование объекта.

V>>Тут у него поведение копирующего конструктора отличается собственно от копирования.
V>>А если так и задумано кодером?
L_L>А вот не надо такого задумывать и проблем не будет. Т.е. не надо полагаться на то, что конструктор копирования будет обязательно вызван.

Странно как-то, ведь предусмотренно переопределение copy-ctor, для конкретного указания кодером того как надо копировать объект. Правда в данном случае и я затрудняюсь придумать чтоже умного тут можно сделать. А может как раз на автора снизошло озарение и он понел что, а тут какие-то условности.. Толи компилер вызовет определенныю кодером операцию, толи забьет на него " в целях оптимизации"..
... << RSDN@Home 1.2.0 alpha rev. 677>>
специализация — удел насекомых... (с) Р. Хайнлайн
Re: Copy-конструктор - подскажите, что не так?
От: Aleksis  
Дата: 25.05.07 16:33
Оценка:
День добрый еще раз, аноним это я

Большое спасибо за ответы! Получается, что в copy-конструкторах смысла особого нету, если у оптимизатора есть официальное право избегать лишнего (на его взгляд) копирования объектов. Т.е. лучше их вообще всеми силами избегать? Согласен, что пример выше несколько притянут за уши, но ситуация, когда в принципе укладывающийся в спецификацию языка код вызывает разные результаты в зависимости от конкретного компайлера, несколько пугает
Re[5]: Copy-конструктор - подскажите, что не так?
От: Roman Odaisky Украина  
Дата: 25.05.07 16:43
Оценка:
Здравствуйте, hVostt, Вы писали:

V>Странно как-то, ведь предусмотренно переопределение copy-ctor, для конкретного указания кодером того как надо копировать объект. Правда в данном случае и я затрудняюсь придумать чтоже умного тут можно сделать. А может как раз на автора снизошло озарение и он понел что, а тут какие-то условности.. Толи компилер вызовет определенныю кодером операцию, толи забьет на него " в целях оптимизации"..


В стандарте четко описано, что можно оптимизировать, а что нельзя.
До последнего не верил в пирамиду Лебедева.
Re[2]: Copy-конструктор - подскажите, что не так?
От: av Россия  
Дата: 25.05.07 16:46
Оценка:
Здравствуйте, Aleksis, Вы писали:

A>День добрый еще раз, аноним это я


A>Большое спасибо за ответы! Получается, что в copy-конструкторах смысла особого нету, если у оптимизатора есть официальное право избегать лишнего (на его взгляд) копирования объектов. Т.е. лучше их вообще всеми силами избегать? Согласен, что пример выше несколько притянут за уши, но ситуация, когда в принципе укладывающийся в спецификацию языка код вызывает разные результаты в зависимости от конкретного компайлера, несколько пугает


Избегать их нет необходимости, если они нужны.

Другой вопрос в том, что, как уже говорилось, стандарт позволяет компилятору предполагать, что конструктор копирования копирует объекты, а не занимается самодеятельностью. Чтобы код работал всегда так, как надо, надо всего лишь, чтобы программа соответствовала представлениям компилятора о ней
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.