Я недавно открыл файл в проекте, над которым я работаю, и нашел некоторые «фабричные методы», например: < /p>
Код: Выделить всё
class FactoryForTypeX
{
static std::unique_ptr create(..)
{
auto x{std::make_unique(..)};
// do something with object and function parameters
return x;
}
};
< /code>
Я позже понял, что эти «фабрики» используются в другом разделе приложения, более или менее в следующем: < /p>
// ...
std::vector my_container;
my_container.push_back(FactoryForTypeX::create(..));
my_container.push_back(FactoryForTypeY::create(..));
// and so on...
(если этот код кажется странным, это моя вина в упрощении его; это имеет смысл в контексте) Действительно, не зная контекста их использования, я бы инстинктивно переписывал их, не используя std :: ulious_ptr и возвращая простой тип. Я рассуждаю, что нет динамического полиморфизма - мы используем статический метод вместо виртуального - поэтому мы не связаны с определенным интерфейсом, и функция не должна выделять память на куче, если она действительно не должна.
Код: Выделить всё
// ...
std::vector my_container;
my_container.push_back(std::make_unique(FactoryForTypeX::create(..)));
my_container.push_back(std::make_unique(FactoryForTypeY::create(..)));
// and so on...
< /code>
Но у меня есть подозрение, что это дороже, чем предыдущая версия. Принимая то, что написано за стоимость первой связи, не рассматривая какую -либо элизию копии, я создаю временные объекты, которые затем передаются в std :: make_unique
, а затем перенесли (или скопировали) на их окончательное место на куче; В стартовом коде вызывающему для этих заводских методов не нужно было оплачивать какую -либо стоимость. Итак, мой вопрос: есть ли какая -то элисия копии или другая оптимизация, в основном позволяя NRVO из заводских методов писать непосредственно на выделенной памяти на куче? Если да, то надежным или необязательным? В более общем плане, это то, что я пытаюсь сделать - давая только вызывающему абоненту воспаление, чтобы решить, хочет ли он создаваться на куче или стеке - хорошая идея?
Подробнее здесь:
https://stackoverflow.com/questions/797 ... plain-type