The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала м..."
Отправлено cheshirekot, 04-Фев-23 13:57 
Окей, короче, давайте просто сравним две абстракции: плюсовый std::vector (динамический массив) и гошный slice (динамическое представление над элементами массива).

1. Внутри у обоих тупо массив, он по определению непрерывный кусок памяти фиксированной длины, ресайзиться не умеет (но нам и пофигу, что оно там внутри, хоть реаллокация, хоть ссылки, хоть 15 тренированных бобров, которые умеют быстро запоминать цифры, до тех пор пока эти инкапсулированные детали реализации не начинают лезть наружу).
2. Пока нам не требуется ресайз, и вектор, и слайс совершенно одинаково тупо пишут/читают элементы массива по смещению.
3. И вот тут нам при очередном append'е места в массиве не хватило... Что дальше?
3.1. В обоих случаях аллоцируется НОВЫЙ МАССИВ, в который гарантированно влезет все, что нужно, содержимое старого копируется в новый.
3.2. Возникают нюансы. Вектор - в поле данных пишет ссылку на новый массив. Слайс? А вот слайс - нифига, он ПРЕДСТАВЛЕНИЕ, он не управляет своим массивом. Да и append'а у него нет, append - сбоку. И этот append берет слайс, видит, что места не хватает, и создает НОВЫЙ СЛАЙС, в который кладет НОВЫЙ МАССИВ.

Понимаете, в чем суть: вектор УМЕЕТ создавать массив нужной длины и копировать, а слайс - НЕТ. Сколько ни append'и чего угодно в std::vector - это будет ТОТ ЖЕ САМЫЙ вектор, у которого внутри происходит какая-то магия. А вот append слайса - это вещь сбоку (т.е. та же самая магия происходит СБОКУ слайса, а не внутри него), и при append'е может вернуться ДРУГОЙ СЛАЙС.

Еще раз, при аллокации:
- std::vector - тот же самый вектор, но с новым массивом внутри.
- slice - новый слайс.
Чуете же разницу?

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
  Введите код, изображенный на картинке: КОД
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру