2010-04-03 3 views
1

я следующий код:Copy оптимизация метод составителей

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 (возвращает копию вместо ссылки) не имеет никакого отношения к визуальной студии 2008 (в отношении количества раз, когда копируется вызов). Я думаю, что он оптимизирован - обычно он должен сначала сделать копию для возвращаемого значения, а затем оператор назначения вызова еще раз назначить переменную sc.

Как вы относитесь к такой оптимизации в разных компиляторах?

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

+1

Кроме того, ваш конструктор копирования и 'operator =' должны принимать ссылки 'const'. – Thomas

+0

На самом деле это была очень простая домашняя работа - класс из 119 строк реализации. Каждый метод вызывается не более нескольких раз, и он никогда не будет расширяться. Причина для этого - количество внимания, которое он получает в учебниках на C++. Производительность не вызывает беспокойства в этой программе - стек копирования реализуется с использованием только push и pop-методов, что делает его превосходно неэффективным. И счет мог быть сохранен в качестве частной переменной в первую очередь и т. Д. –

+0

Итак, на ваш вопрос: «На практике ли компиляторы исключают временные значения в определениях, которые используют инициализацию копирования?», Поскольку комментарий в коде _seems_ to показать недоразумение о ссылках в качестве возвращаемых значений. –

ответ

2

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

Stack copy=CopyStack(); 

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

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

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

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

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

Stack copy(*this); 
+0

Спасибо, что нашли время, чтобы отправить ответ. Точка метода CopyStack - это удобство записи, или, может быть, лучший ответ: сначала я написал метод CopyStack, только чтобы заменить его на эту комбинацию из трех методов, когда исходная идея не сработала. Элемент управления приходит, чтобы скопировать конструктор, хотя позже - и этот комментарий был больше для меня. Я больше надеялся, что у кого-то был опыт работы с GCC или каким-то другим компилятором (с точки зрения оптимизации в отношении таких вещей), и мы могли бы поделиться им с нами. –

0

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

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

+0

Спасибо за потраченное время, но вы также, кажется, пропустите точку, точно так же, как Томас (см. Комментарий к первому сообщению) и Чарльз Бейли. –

0

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

+0

GCC, BTW, применяет эти два алгоритма, как и большинство других компиляторов. Кроме того, вам может быть интересно взглянуть на «семантику перемещения» C++ 0x. Перемещение семантики позволяет исключить ненужное копирование объектов, просто воспользовавшись тем фактом, что нет смысла копировать временный объект, на который не ссылается ни на что другое, и вскоре он будет уничтожен. – themoondothshine

+0

На самом деле я удивлен, что компилятор сделал хорошую оптимизацию моего кода, со всей критикой C++. –

+0

Критика ?? Ну, для меня C++ всегда был очень мощным языком (и я ненавижу управляемый код!), Но эй ... есть две стороны каждой истории, не так ли? – themoondothshine

Смежные вопросы