operators (Помогите разобраться)

Модератор: Модераторы разделов

v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: operators

Сообщение v04bvs »

Чтобы окончательно разрешить спор о копировании возвращаемого значения приведу вот этот лог.

Код: Выделить всё

#include <iostream>

struct A
{
    A( ) { std::cout << "A::A\n"; }
    A( const A& ) { std::cout << "A::A(A&)\n"; }
    ~A( ) { std::cout << "A::~A\n"; }

    A& operator=(const A&) { std::cout << "A::operator=\n"; }
};

A foo()
{
    return A();
}

A bar()
{
    A result;
    return result;
}

int main( )
{
    std::cout << "1\n";
    A a = foo();
    std::cout << "2\n";
    a = foo();
    std::cout << "3\n";
    A b = bar();

    return 0;
}
% g++ --version
g++ (GCC) 4.0.4 20060507 (prerelease) (Debian 4.0.3-3)
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

% g++ test.cpp
% ./a.out
1
A::A
2
A::A
A::operator=
A::~A
3
A::A
A::~A
A::~A


Как видно, конструктор копирования не был вызван ни разу, в коде не применялось никаких ухищрений, вроде возврата ссылки.
Т.е. обычный стандартный код выполняется без каких либо потерь на копирование временных объектов.
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: operators

Сообщение Zeus »

Попробовал вот что:

Код: Выделить всё

#include <iostream>

struct A
{
    A ()
    {
    std::cerr << "Объект создан!" << std::endl;
    }
};

A
getA ()
{
    A a;
    return a;
}

int
main ()
{
    A a;
    a = getA ();
}


Он выводит фразу 2 раза.
Хотя по моей версии должен выдать 3 раза.
Если сделать getA inline - ничего не меняется.
Вывалил прогу в asm-код (опция -S у g++) - посмотрю на досуге.
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: operators

Сообщение oav »

Ну лана вам всем :)

Вся эта муть называется вот так:
http://msdn.microsoft.com/library/default..../nrvo_cpp05.asp

в гцц есть аналог
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: operators

Сообщение v04bvs »

Ну смотреть в MSDN для выяснения "фишек" С++ это конечно круто =)
Как эта муть называется, и почему она есть, можно прочитать в моём последнем посте на 1-й странице. Думаю, стандарт C++ правильнее читать, чем MSDN =)
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: operators

Сообщение oav »

v04bvs писал(а):
07.06.2006 15:21
Ну смотреть в MSDN для выяснения "фишек" С++ это конечно круто =)
Как эта муть называется, и почему она есть, можно прочитать в моём последнем посте на 1-й странице. Думаю, стандарт C++ правильнее читать, чем MSDN =)

если я не ошибаюсь, этого в стандарте еще нет. только в будущем
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: operators

Сообщение v04bvs »

Цитату из стандарта я привёл в своём последнем сообщении на первой странице этой темы.
А может быть я не так что то понял..
Спасибо сказали:
Аватара пользователя
oav
Бывший модератор
Сообщения: 296

Re: operators

Сообщение oav »

v04bvs писал(а):
07.06.2006 15:39
Цитату из стандарта я привёл в своём последнем сообщении на первой странице этой темы.
А может быть я не так что то понял..

да не, это не то. тут речь идет о оптимизации return value
Спасибо сказали: