Оптимизация метода копирования в компиляторах - PullRequest
1 голос
/ 03 апреля 2010

У меня есть следующий код:

void Stack::operator =(Stack &rhs)
{
    //do the actual copying
}

Stack::Stack(Stack &rhs) //copy-constructor
{
    top=NULL; //initialize this as an empty stack (which it is)
    *this=rhs; //invoke assignment operator
}

Stack& Stack::CopyStack()
{
    return *this; //this statement will invoke copy contructor
}

Используется так:

unsigned Stack::count()
{
    unsigned c=0;
    Stack copy=CopyStack();
    while (!copy.empty())
    {
        copy.pop();
        c++;
    }
    return c;
}

Удаление символа ссылки из объявления CopyStack (возвращение копии вместо ссылки) не имеет значения в Visual Studio 2008 (относительно количества попыток копирования). Я думаю, что это оптимизируется - обычно сначала нужно сделать копию для возвращаемого значения, затем вызвать оператор присваивания еще раз, чтобы присвоить его переменной sc.

Каков ваш опыт оптимизации такого рода в разных компиляторах?

С уважением, Dženan

Ответы [ 3 ]

2 голосов
/ 03 апреля 2010

Этот оператор является инициализацией копирования Stack с именем copy из возвращаемого значения CopyStack(). Там нет назначения.

Stack copy=CopyStack();

В этой функции комментарий некорректен. Не вызывается конструктор копирования, поскольку возвращаемое значение является ссылкой.

Stack& Stack::CopyStack()
{
    return *this; //this statement will invoke copy contructor
}

Это означает, что первоначальная инициализация, по сути, является копированием-конструкцией из переменной *this.

Если возвращаемое значение было по значению, то инициализация копирования была бы из временной, но той, которая могла бы быть корректно устранена компилятором.

Я не вижу смысла в функции CopyStack. Было бы более логично просто выполнить прямую инициализацию:

Stack copy(*this);
0 голосов
/ 03 апреля 2010

Полагаю, вам нужны RVO (оптимизация возвращаемых значений) и NRVO (оптимизация именованных возвращаемых значений). Оптимизация компилятора - обширная тема, и если бы я начал печатать описание, это заняло бы слишком много времени! Просто прочитайте это сообщение в блоге ... Это хорошо объясняет.

0 голосов
/ 03 апреля 2010

Если я правильно понимаю, вы можете создавать прототипы своих стековых объектов и вместо них возвращать прототипы, что может привести к некоторой производительности, но вы должны быть осторожны с владением объектами для ресурсов памяти.

Вы можете использовать шаблон проектирования Prototype Factory, если хотите.

...