Неверно, что Vec
(структура, содержащая указатель, длину и емкость) всегда хранится в стеке.Вы можете переместить любой тип (за исключением самоссылочных, которые нельзя переместить) из стека в кучу, поместив его в Box
, Vec
или другой интеллектуальный указатель с использованием кучи.Просто рассмотрим простой тип, такой как i64
: он может храниться в стеке (или в регистре, если компилятор так выберет), но если вы напишите vec![7i64]
, у вас будет i64
, хранящийся в куче, и единственныйв стеке осталась только Vec
(указатель плюс длина и емкость).
При этой аналогии нетрудно понять, что то же самое относится и к String
: она может быть в стеке, но вы можете положить его в кучу, создав Vec<String>
.Таким образом, если у вас есть Vec<String>
длиной 100, существует 101 независимых распределений кучи: одно принадлежит Vec
, а другое принадлежит каждому из String
s.
См. Также