Я читал во многих местах, что при использовании make_shared<T>
для создания shared_ptr<T>
его управляющий блок содержит блок хранения, достаточно большой для хранения T
, а затем объект создается внутри хранилища с помощью размещение нового. Что-то вроде этого:
template<typename T>
struct shared_ptr_control_block {
std::atomic<long> count;
std::atomic<long> weak_count;
std::aligned_storage_t<sizeof (T), alignof (T)> storage;
};
Но я немного смущен, почему мы не можем просто иметь переменную-член с типом T
вместо этого? Зачем создавать исходное хранилище, а затем использовать новое место размещения? Не может ли он быть объединен в один шаг с обычным объектом типа T
?