Пустая строка Swift Распределение памяти Расположение (выделение стека / кучи) - PullRequest
0 голосов
/ 20 декабря 2018

В swift строки являются типами структуры, поэтому значения будут храниться в памяти стека, а не в куче.

Допустим, мы объявляем строку:

let a = ""
let b = "o"

Этопустая строка, но часть памяти выделена.Мне нужно знать, какая разница в памяти для пустой строки и строки с подсчетом, скажем, 1.


Если мы скажем: -

var str:String?
var str: String = ""

Разницав макете памяти по рисунку это то, что мне нужно увидеть.(стек / куча).

Я пытался найти это в Google, но нигде не могу найти макет памяти для этого.

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Как мы знаем, Strings - это тип значения в swift и переменная типа хранения значений при выделении стековой памяти.

var str:String?
var str1: String = ""

в приведенном выше случае оба потребляют стековую память.в str можно присвоить значение nil, но в str1 вы никогда не назначите значение nil.

0 голосов
/ 29 декабря 2018

String - очень сложный зверь.Он имеет много различных базовых представлений, в том числе:

  • Строковые литералы, которые хранятся в виде констант в двоичном виде

  • Небольшие строки, в которых можно хранитьдо 15 кодовых блоков UTF-8, встроенных в стек (по крайней мере, на x86)

  • «Собственные» строки (т. е. строки, которые не были соединены с Objective-C), которыехранятся в выделенном хвостом буфере кучи

  • «Внешние» строки из Obj-C, которые могут быть представлены теговым указателем или выделенной кучей NSString объект

  • «Общие» строки, которые могут представлять строковый литерал Swift в виде выделенного в куче объекта Obj-C

Если вы хотите погрузиться в мелкие мелкие детали, вы можетеначните с StringObject.swift , в котором есть несколько комментариев, объясняющих некоторые детали макета.

Чтобы ответить на ваш вопрос о приведенных вами примерах:


let a = ""

Пустая строка имеет каноническую маленькую строку representation , которая хранится в стеке inline.


let b = "o"

Строковый литерал хранится в двоичном виде как константа.Следовательно, выделение кучи не требуется - указатель на адрес строки в двоичном файле - это все, что требуется.

Но даже если это не постоянная строка, например, она была создана:

let o = "O".lowercased()

Тогда он все еще может быть представлен в виде небольшой строки, которая хранится в стеке.


var str: String?

String имеет дополнительного жителя (вминимум на x86), что означает, что String? может использовать тот же макет, что и String.Значение nil представлено одним из битовых шаблонов дополнительных обитателей.

Но даже если String не имеет дополнительного обитателя, дополнительное выделение кучи не потребуется для представления String? над String - для этого потребуется только дополнительный бит встроенного хранилища.

0 голосов
/ 21 декабря 2018

Насколько я знаю, strings в swift имеет семантику типов значений с множеством оптимизаций (копирование при записи и т. Д.), Но под капотом они соединены с классом NSString, поэтому они размещаются в куче.

Семантика типа значения означает, что с точки зрения программиста swift они копируются (с оптимизацией копирования при записи), когда мы присваиваем значение другой переменной или передаем методу, мы можем изменять значение внутри метода, и исходная строка не будетзатронут, пусть ключевое слово запрещает мутации (проверено компилятором) и так далее.

Я бы порекомендовал вам посмотреть Майк Эш Изучение схемы быстрой памяти презентация GOTO 2016 конференция.

...