Существует ли такая оптимизация в g ++? - PullRequest
1 голос
/ 10 июля 2010

Рассмотрим следующий фрагмент кода:

list<someClass>& method();
....
list<someClass> test = method();

Каким будет поведение?Будет ли этот код:

  1. Возвращать ссылку на экземпляр someClass, возвращаемый оптимизацией возвращаемого значения из метода (), и затем выполнять конструктор копирования someClass для ссылки?

  2. Как-нибудь не вызывать конструктор копирования?

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

РЕДАКТИРОВАТЬ: Erm, извините, код компилируется сейчас ...

Ответы [ 4 ]

4 голосов
/ 10 июля 2010

Необходимо вызвать конструктор копирования, потому что этот код должен сделать копию: функция method() возвращает ссылку на некоторый объект, копия которого должна храниться в переменной test.

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

Если вы не хотите делать копию списка, вы можете сделать test ссылку:

list<someClass>& test = method();

Однако test будет ссылаться на исходный список, поэтому любые изменения, сделанные в test, будут также вноситься в исходный список, и всякий раз, когда исходный список уничтожается, test становится недействительным (что означает Вы должны быть более осторожны с временем жизни объекта).

1 голос
/ 10 июля 2010

Существует RVO. Я не уверен, применимо ли это здесь. В любом случае это один из способов минимизировать копирование.

http://en.wikipedia.org/wiki/Return_value_optimization

0 голосов
/ 10 июля 2010

Глядя на ваш код, трудно рискнуть догадаться о том, чего вы пытаетесь достичь, вернув ссылку на список, а затем сделав его копию.

Обдумайте идею возвращения итератора в список (или ссылку на итератор), если это возможно (при условии, что список не является чем-то локальным для функции и т. Д.).

0 голосов
/ 10 июля 2010

Ну, вы не можете назначить список someClass (если вы не перегружаете оператор присваивания или конструктор копирования и не используете возвращенный список для копирования конструкции).Если вы этого не сделали, это не должно компилироваться.

...