Есть ли что-то неправильное в возврате сконструированных значений по умолчанию?

StackOverflow https://stackoverflow.com/questions/96500

Вопрос

Предположим, у меня есть следующий код:

class some_class{};

some_class some_function()
{
    return some_class();
}

Кажется, это работает довольно хорошо и избавляет меня от необходимости объявлять переменную только для того, чтобы получить возвращаемое значение.Но я не думаю, что когда-либо видел это в каком-либо учебнике или справочнике.Это специфичная для компилятора вещь (visual C ++)?Или это делает что-то не так?

Это было полезно?

Решение

Нет, это совершенно справедливо.Это также будет более эффективным, поскольку компилятор действительно способен оптимизировать временное значение.

Другие советы

Возврат объектов из вызова функции является "заводским" шаблоном проектирования и широко используется.

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

Он действителен, но производительность может быть не идеальной в зависимости от того, как он вызывается.

Например:

A a;
a = fn();

и

A a = fn();

это не одно и то же.

В первом случае вызывается конструктор по умолчанию, а затем для a вызывается оператор присваивания, который требует создания временной переменной.

Во втором случае используется конструктор копирования.

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

Разница между примером Роба Уокера называется оптимизацией возвращаемого значения (RVO), если вы хотите найти ее в Google.

Кстати, если вы хотите гарантировать, что ваш объект будет возвращен наиболее эффективным способом, создайте объект в куче (т. Е. через new), используя shared_ptr, и верните shared_ptr вместо этого.Указатель возвращается, и ссылка подсчитывается правильно.

Это вполне разумно для C ++.

Это совершенно законный C ++, и любой компилятор должен принять это.Что заставляет вас думать, что он может делать что-то не так?

Это лучший способ сделать это, если ваш класс довольно легкий - я имею в виду, что сделать его копию не очень дорого.

Однако одним из побочных эффектов этого метода является то, что он, как правило, повышает вероятность создания временных объектов, хотя это может зависеть от того, насколько хорошо компилятор может оптимизировать работу.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top