我想找到字符串变量占用的内存,以字节为单位。 让我们假设我们有一个名为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编码。
我想验证这个说法。
提前致谢。
答案 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个字节。字符串的长度并不重要。