20 лет свирель, котомка

Jul 19, 2007 05:40

1. В библиотеке языка C++ eсть функция getline(istream&,std::string &), оченно полезная. Узнал о ее существовании только вчера.
2. Что напечатает следующая программа?
puzzle )

компьютеры

Leave a comment

dimrub July 19 2007, 10:02:44 UTC
> Программа печатает не вполне то что я ожидал, да.

А в чем именно расхождения?

Reply

Что у меня в кармашке? trurle July 19 2007, 10:07:05 UTC
Ну а что она по товему должна напечатать?

Reply

Re: Что у меня в кармашке? dimrub July 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

Reply

Re: Что у меня в кармашке? trurle July 19 2007, 10:11:27 UTC
А временный объект куда делся?

Reply

Re: Что у меня в кармашке? dimrub July 19 2007, 10:16:14 UTC
В смысле? Почему assignment не сработал? Видимо, компилятор умен.

Reply

Re: Что у меня в кармашке? trurle July 19 2007, 10:17:40 UTC
О!
Вместо создания временного объекта и присваивания соптимизировал все нах.

Reply

Re: Что у меня в кармашке? oblomov_jerusal July 19 2007, 11:00:16 UTC
Разве Foo bar = baz; это не то же самое, что Foo bar(baz);? Т.е. компилятор соптимизировал лишний вызов конструктора (и вызов деструктора, если бы он был).

Reply

Делайте Ваши ставки trurle July 19 2007, 11:25:44 UTC
Что должна напечать эта программа?

Reply

Re: Делайте Ваши ставки oblomov_jerusal July 20 2007, 01:26:07 UTC
Есди совсем-совсем без оптимизации, то, я думаю, copy constructor должен вызываться после каждого оператора, возвращающего Complex, т.к. внутри оператора создается локальный объект, а при возврате он должен быть скопирован туда, куда объект возвращается. На самом деле, насколько я понимаю, функция, возвращающая объект имеет неявный параметр, указывающий, куда нужно положить возвращаемое значение. При оптимизации операторов компилятор решает строить объект сразу по этому адресу, а не создавать локальный объект и копировать. При оптимизации main он решает, что для последнего вызова этот неявный параметр должен указывать не на место для временного объекта, а прямо на переменную (собственно, это даже можно не считать оптимизацией).

Reply

Re: Что у меня в кармашке? tejblum July 19 2007, 11:05:54 UTC
Никакого присваивания тут просто нет даже с точки зрения синтаксиса. Complex c3 = ... это не присваивание, а дефиниция объекта с инициализатором. Т.е. это даже не вопрос работы оптимизатора.

Reply

Делайте Ваши ставки trurle July 19 2007, 11:24:56 UTC
Ну и что же по Вашему должна напечатать эта программа?

Reply

Re: Делайте Ваши ставки tejblum July 19 2007, 13:21:20 UTC
Так ведь dimrub уже написал ответ сверху.

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

Re: Делайте Ваши ставки trurle July 19 2007, 13:25:41 UTC
Аифгительно на самом деле.
Ну вот теперь буду знать, да.

Reply

Re: Что у меня в кармашке? mtyukanov July 19 2007, 11:37:21 UTC
Автоинлайн, похоже. Автоинлайн вместе с включенным оптимизатором такое любит.

Reply

Re: Что у меня в кармашке? tejblum July 19 2007, 13:00:04 UTC
Никакой инлайнинг, авто или нет, не убирает печатей.

Reply

Re: Что у меня в кармашке? mtyukanov July 19 2007, 15:00:22 UTC
Инлайн позволяет убрать две временных переменных.

Одну -- в точке выхода из operator+(Complex&, Complex&). Другую -- в точке выхода из operator+(Float).

Если бы не инлайнизация, они бы создавались на стеке этих функций, и оптимизация была бы крайне затруднена.

Reply


Leave a comment

Up