迅速被字符串变量占用的内存

Nav*_*han 3 swift

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

let test = "abvd"
Run Code Online (Sandbox Code Playgroud)

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

我已经检查了计算Swift字符串的字节大小的详细信息

但是这个问题是不同的。

根据苹果的说法,“在幕后,Swift的本机String类型是根据Unicode标量值构建的。Unicode标量是字符或修饰符的唯一21位数字,例如用于拉丁文小写字母A(“ a”的U + 0061 ),或U + 1F425(前面板婴儿小鸡)(“”)。可以在https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html中找到

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

我想核实这一说法。

提前致谢。

Rob*_*ier 6

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

对于您的特定问题,这可能是您正在寻找答案的开始(但再次,这是当前的实现;它不属于任何规格):

/// 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.
Run Code Online (Sandbox Code Playgroud)

您要找的答案的结尾是“很复杂”。

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

String 只有一个属性:

var _core: _StringCore
Run Code Online (Sandbox Code Playgroud)

_StringCore具有以下属性:

public var _baseAddress: UnsafeMutableRawPointer?
var _countAndFlags: UInt
public var _owner: AnyObject?
Run Code Online (Sandbox Code Playgroud)

每个存储空间占用一个字(在64位平台上为8个字节),因此总共有24个字节。字符串有多长都没关系。