И в std :: array у нас есть указатель на данные и их размер (в основном такие же, как количество указателей в shared_ptr).
Это неверно. std::array
- это в основном
template <typename T, std::size_t N>
struct array
{
T data[N];
};
Нет выделения, указателя или переменной дополнительного размера. Он просто обертывает необработанный массив и предоставляет функции, чтобы сделать его контейнером.
std::shared_ptr
на другом хранит указатель и требует динамического выделения объекта, на который указывает объект. Это также должно быть подсчитано ссылок, и это должно быть сделано потокобезопасным способом, что приводит к большим накладным расходам.
Вот почему array
является «абстракцией с нулевой стоимостью», а shared_ptr
- нет.