The OpenNET Project / Index page

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



"Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала модулей Go"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Присылайте удачные настройки в раздел примеров файлов конфигурации на WIKI.opennet.ru.
. "Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала м..." +/
Сообщение от cheshirekot (ok), 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 - новый слайс.
Чуете же разницу?

Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала модулей Go, opennews, 02-Фев-23, 11:04  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



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

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