gpt4 book ai didi

string - 字符串和静态字符串的区别

转载 作者:IT王子 更新时间:2023-10-29 05:13:28 25 4
gpt4 key购买 nike

我正在浏览 docs ,然后我找到了 StaticString。它指出:

An simple string designed to represent text that is "knowable at compile-time".

我最初认为 StringNSString 具有相同的行为,这在编译时是已知的,但看起来我错了。所以我的问题是我们什么时候应该使用 StaticString 而不是 String,唯一的区别是 StaticString 在编译时是已知的吗?

我发现的一件事是

var a: String = "asdf" //"asdf"
var b: StaticString = "adsf" //{(Opaque Value), (Opaque Value), (Opaque Value)}

sizeofValue(a) //24
sizeofValue(b) //17

所以看起来 StaticString 的内存占用少了一点。

最佳答案

StaticString 似乎可以保存字符串文字。您不能将 String 类型的变量分配给它,也不能改变它(例如,使用 +=)。

“在编译时可知” 并不意味着变量持有的值将在编译时确定,只是指分配给它的任何值在编译时都是已知的。

考虑这个确实有效的例子:

var str: StaticString

for _ in 1...10 {
switch arc4random_uniform(3) {
case 0: str = "zero"
case 1: str = "one"
case 2: str = "two"
default: str = "default"
}
print(str)
}

只要您可以向 Swift 提供有关如何使用变量的更多信息,它就可以优化使用它的代码。通过将变量限制为 StaticString,Swift 知道该变量不会发生变化,因此它可以更有效地存储它,或者更有效地访问各个字符。

事实上,StaticString 可以只用一个地址指针和一个长度来实现。它指向的地址就是静态代码中定义字符串的地方。 StaticString 不需要被引用计数,因为它不(需要)存在于堆中。它既没有分配也没有释放,所以不需要引用计数。

“在编译时可知” 非常严格。即使这样也行不通:

let str: StaticString = "hello " + "world"

因错误而失败:

error: 'String' is not convertible to 'StaticString'

关于string - 字符串和静态字符串的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32247387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com