1. В библиотеке языка C++ eсть функция getline(istream&,std::string &), оченно полезная. Узнал о ее существовании только вчера.
2. Что напечатает следующая программа?
( puzzle )
Re: Что у меня в кармашке?dimrubJuly 19 2007, 10:10:12 UTC
Именно то, что напечатала:
Complex created by constructor with args Complex created by constructor with args operator+(Complex&,Complex&) Complex created by default constructor Complex::operator+(float) Complex created by default constructor
Re: Что у меня в кармашке?oblomov_jerusalJuly 19 2007, 11:00:16 UTC
Разве Foo bar = baz; это не то же самое, что Foo bar(baz);? Т.е. компилятор соптимизировал лишний вызов конструктора (и вызов деструктора, если бы он был).
Re: Делайте Ваши ставкиoblomov_jerusalJuly 20 2007, 01:26:07 UTC
Есди совсем-совсем без оптимизации, то, я думаю, copy constructor должен вызываться после каждого оператора, возвращающего Complex, т.к. внутри оператора создается локальный объект, а при возврате он должен быть скопирован туда, куда объект возвращается. На самом деле, насколько я понимаю, функция, возвращающая объект имеет неявный параметр, указывающий, куда нужно положить возвращаемое значение. При оптимизации операторов компилятор решает строить объект сразу по этому адресу, а не создавать локальный объект и копировать. При оптимизации main он решает, что для последнего вызова этот неявный параметр должен указывать не на место для временного объекта, а прямо на переменную (собственно, это даже можно не считать оптимизацией).
Re: Что у меня в кармашке?tejblumJuly 19 2007, 11:05:54 UTC
Никакого присваивания тут просто нет даже с точки зрения синтаксиса. Complex c3 = ... это не присваивание, а дефиниция объекта с инициализатором. Т.е. это даже не вопрос работы оптимизатора.
Complex created by constructor with args Complex created by constructor with args -- конструирование c1 и c2 operator+(Complex&,Complex&) -- вызов c1+c2 Complex created by default constructor -- Complex res внутри c1+c2 Complex::operator+(float) -- вызов +3 Complex created by default constructor -- Complex res внутри operator+, которое делается в месте, которое будет занимать c3.
А в чем именно расхождения?
Reply
Reply
Complex created by constructor with args
Complex created by constructor with args
operator+(Complex&,Complex&)
Complex created by default constructor
Complex::operator+(float)
Complex created by default constructor
Reply
Reply
Reply
Вместо создания временного объекта и присваивания соптимизировал все нах.
Reply
Reply
Reply
Reply
Reply
Reply
Complex created by constructor with args
Complex created by constructor with args -- конструирование c1 и c2
operator+(Complex&,Complex&) -- вызов c1+c2
Complex created by default constructor -- Complex res внутри c1+c2
Complex::operator+(float) -- вызов +3
Complex created by default constructor -- Complex res внутри operator+, которое делается в месте, которое будет занимать c3.
Reply
Ну вот теперь буду знать, да.
Reply
Reply
Reply
Одну -- в точке выхода из operator+(Complex&, Complex&). Другую -- в точке выхода из operator+(Float).
Если бы не инлайнизация, они бы создавались на стеке этих функций, и оптимизация была бы крайне затруднена.
Reply
Leave a comment