【问题标题】:Does String.init(cString: UnsafePointer<Int8>) copy the memory contents?String.init(cString: UnsafePointer<Int8>) 是否复制内存内容?
【发布时间】:2020-10-06 17:19:31
【问题描述】:

内部工作原理是什么?

它会创建 C 字符串数据的 Swift 字符串副本吗?

它是否将其用作引用并将其作为 Swift 字符串返回,因此返回的字符串使用相同的数据?它是如何工作的?

它是否将 C 字符串复制到新分配的 Swift 字符串中?

如果String(cString: UnsafePointer&lt;Int8&gt;)确实通过将C字符串复制到新分配的swift字符串来工作,有没有办法通过引用已经存在的数据而不是复制来将C字符串转换为swift?

String(cString: UnsafePointer&lt;Int8&gt;) 是如何工作的,我如何确定它是否复制,或者它是否引用与 Swift 字符串相同的内存?

【问题讨论】:

  • 您阅读过文档吗? developer.apple.com/documentation/swift/string/1641523-init "通过复制给定指针引用的以 null 结尾的 UTF-8 数据创建一个新字符串。"
  • 我尝试编辑您的问题,使其不再像文字墙一样,但仍然有很多重复,请以不同的方式询问相同的问题。您可以根据需要将其编辑下来吗?
  • 另外,实现是开源的。如果您有兴趣,可以自己深入了解:github.com/apple/swift/blob/…

标签: swift string pointers memory


【解决方案1】:

documentation 明确指出数据被复制:

初始化器

init(cString:)

通过复制给定指针引用的以 null 结尾的 UTF-8 数据创建一个新字符串。


有没有办法通过引用已经存在的数据而不是复制它来将 C 字符串转换为 swift?

不。字符串经常被复制/销毁,这涉及对底层缓冲区进行保留/释放操作,以对引用计数进行必要的保留。如果内存不属于字符串,则无法可靠地解除分配。

你想通过避免复制来达到什么目的?

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    相关资源
    最近更新 更多