The OpenNET Project / Index page

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



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

Исходное сообщение
"Выпуск языка Go 1.20. SourceHut отменил блокировку зеркала м..."
Отправлено cheshirekot, 04-Фев-23 22:56 
>> Я конечно мог бы вас потроллить на тему "а что такое динамический массив, и кто на самом деле аллоцирует?" и было бы забавно.

Не, это было бы грустно...
"Динамическим называется массив, размер которого может изменяться во время исполнения программы" - собственно, все. В понимании того, что такое собственно массив мы с вами, вроде, сходимся.

Ну т.е. нам нужна штука, которая выглядит как массив, ведет себя как массив, и при этом, самое важное, умеет менять свой размер. Монотонно, однообразно, без сюрпризов, просто тупо менять свой размер...
Ну, собственно, слайс не умеет (если вы срочно не покажете мне, как изменить cap существующего инициализированного слайса). Финал.

>> кто на самом деле аллоцирует

Аллоцирует make, например. В спеке же написано, что make делает. Он аллоцирует массив с размерностью cap и отдает этот массив в функцию slice, которая на выходе тупо возвращает структуру, содержащую 2 int'а и один unsafe.Pointer.
make([]int, 50, 100) - полный эквивалент new([100]int)[:50].
При этом никто не запрещает сделать так:
```
array := new([100]int)
slice1 := array[:50]
slice2 := array[50:]
```
Что мы только что посмотрели? Ну, как бэ, у нас 1(один) массив и 2(два) слайса над ним. Представляете, ДВА слайса ссылаются на ДВА разных диапазона ОДНОГО массива! Как эту концепцию принято в программировании называть? Представление же? Да? А по английски оно же view будет?

Теперь внимательно посмотрим, кто на самом деле аллоцировал... Ну, очевидно, не слайс... Аллоцировала директива make... А слайс тут не при чем, он аллоцировать не умеет, он ПРИ ИНИЦИАЛИЗАЦИИ принимает массив, и положить внутрь себя другой не может. Если надо новый массив, т.к. в старый уже не лезет... Ну, вот вам append, он может создать ДРУГОЙ массив и нарезать НОВЫЙ слайс из него. А вот cap старого изменить, или внутрь старого новый массив положить - нет, не может... Поэтому и не динамический. Потому что при увеличении размера массива создается новый слайс.

 

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



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

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