swift中的字符串变量占用的内存

时间:2017-02-24 14:59:43

标签: swift

我想找到字符串变量占用的内存,以字节为单位。 让我们假设我们有一个名为test

的变量
let test = "abvd"

我想知道如何在运行时找到测试的大小。

我已查看Calculate the size in bytes of a Swift String

中的详细信息

但这个问题不同。

据苹果公司称,“在幕后,Swift的原生字符串类型是根据Unicode标量值构建的.Unicode标量是字符或修饰符的唯一21位数字,例如U + 0061,用于拉丁文小写字母A( “a”),或U + 1F425,用于前方婴儿小鸡(“”)。“这可以在https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html

中找到

因此,如果是这样的话,apple实际上使用的是unicode代码点的固定大小表示,而不是动态UTF8编码。

我想验证这个说法。

提前致谢。

1 个答案:

答案 0 :(得分:5)

为了你的真正目标:理解都不正确。字符串不承诺内部表示。它们可以根据它们的构造方式进行各种表示。原则上,如果它们在二进制和内存映射中静态定义,它们甚至可以取零实内存(我不记得StaticString类型是否完全利用了它)。您回答此问题的唯一方法是查看当前实现,从String.swift开始,然后转到StringCore.swift,然后读取其余的字符串文件。< / p>

对于您的特定问题,这可能是您正在寻找的答案的开始(但同样,这是当前的实施;它不是任何规范的一部分) :

/// The core implementation of a highly-optimizable String that
/// can store both ASCII and UTF-16, and can wrap native Swift
/// _StringBuffer or NSString instances.

您正在寻找的答案的结尾是“#34;它很复杂。”#34;

请注意,如果您要求MemoryLayout.size(ofValue: test),您将获得令人惊讶的结果(24),因为这只是测量容器。容器内部有一个引用类型(为指针占用一个存储字)。没有机制可以确定&#34;此值使用的所有存储空间&#34;因为当指针涉及时,它的定义并不是很明确。

String只有一个属性:

var _core: _StringCore

_StringCore具有以下属性:

public var _baseAddress: UnsafeMutableRawPointer?
var _countAndFlags: UInt
public var _owner: AnyObject?

每个存储器都占用一个字(64位平台上的8个字节),因此总共占用24个字节。字符串的长度并不重要。