Сторонняя библиотека имеет API Huge computeHuge()
. Он возвращает сам объект, а не ссылку / указатель. У меня нет контроля над объектом или API.
У меня есть два класса:
class Bar {
Huge h;
Bar(Huge &huge): h(huge);
}
class Foo {
Bar b;
Foo() {
Huge h = computeHuge();
b = Bar(h);
}
К сожалению, в результате этого дизайна (временно) получаются две копии огромного объекта: один копия существует в конструкторе Foo
, а другая существует внутри объекта Bar
. После выхода из конструктора Foo
остается только одна копия, но мне нужно удвоить объем памяти внутри конструктора. Поскольку h
может составлять сотни ГБ, это имеет значение.
Одно из решений этой проблемы - сделать Foo
владельцем h
:
class Bar {
Huge &h;
Bar(Huge &huge): h(huge);
}
class Foo {
Bar b;
Huge h;
Foo() {
h = computeHuge();
b = Bar(h);
}
Это успешно устраняет иметь две копии h
, но в моем приложении это не имеет смысла: Bar
- это то, что нужно h
. Как я могу:
- Вызвать
computeHuge()
в конструкторе Foo
- Позволить
Bar
сохранить право собственности на h
- Все без когда-нибудь нужны две копии
h
в памяти?