Почему std :: shared_ptr считается «тяжелым» и «дорогим», а std :: array «имеет такую ​​же производительность, как и простые (c -стайл) массивы»? - PullRequest
0 голосов
/ 18 июня 2020

Я не совсем понимаю, почему std :: shared_ptr считается «тяжелым» и «дорогим», а std :: array «такой же производительностью, как и простые (c -стайл) массивы»? Как и в shared-ptr, у нас есть указатель и два счетчика: для общих и слабых ссылок. А в std :: array у нас есть указатель на данные и их размер (в основном такие же, как количество указателей в shared_ptr). Вроде такие же накладные расходы, хотя везде написано, что имеет «производительность и доступность массива в стиле C».

Ответы [ 2 ]

7 голосов
/ 18 июня 2020

И в std :: array у нас есть указатель на данные и их размер (в основном такие же, как количество указателей в shared_ptr).

Это неверно. std::array - это в основном

template <typename T, std::size_t N>
struct array
{
    T data[N];
};

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

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

Вот почему array является «абстракцией с нулевой стоимостью», а shared_ptr - нет.

1 голос
/ 18 июня 2020

А в std :: array у нас есть указатель на данные и его размер . Для данного типа значение std::array::size() известно во время компиляции. (Не забывайте, что std::array<int, 2> и std::array<int, 3> - разные типы.)

template < class T, std::size_t N >
constexpr std::size_t std::array<T,N>::size()
{
    return N;
}

Это одна из возможных реализаций. Ее можно было бы сделать функцией-членом static.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...