Имеет ли String.init (cString: UnsafePointer ) скопировать содержимое памяти? - PullRequest
0 голосов
/ 17 июня 2020

Какова внутренняя работа?

Создает ли он строковую копию C строковых данных в Swift?

Использует ли он ее как ссылку и возвращает как строку Swift , значит, в возвращаемой строке используются те же данные? Как это работает?

Копирует ли он строку C в только что выделенную строку Swift?

Если String(cString: UnsafePointer<Int8>) действительно работает, копируя строку C в только что выделенный swift string, есть ли способ преобразовать C строки в быстрые, ссылаясь на уже существующие данные вместо их копирования?

Как работает String(cString: UnsafePointer<Int8>), и как я могу определить, копирует ли он или нет ссылается на ту же память, что и строка Swift?

1 Ответ

0 голосов
/ 17 июня 2020

В документации четко указано, что данные скопированы:

Инициализатор

init (cString:)

Создает новую строку путем копирования данных UTF-8 с завершающим нулем, на которые ссылается данный указатель.


есть ли способ преобразовать C строки в быстрые, ссылаясь вместо этого на уже существующие данные копирования?

Нет. Строки часто копируются / уничтожаются, что включает в себя выполнение операций сохранения / освобождения в базовом буфере для выполнения необходимого сохранения счетчика ссылок. Если память не принадлежит String, то нет способа надежно освободить ее.

Чего вы пытаетесь достичь, избегая копирования?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...