将值类型变量传递给函数时如何复制它,该副本是什么?

SLN*_*SLN 6 function value-type swift

Swift的字符串类型是值类型.如果创建新的String值,则在将String值传递给函数或方法时,或者将其赋值给常量或变量时,将复制该String值.

它被分配给常量或变量时被复制,这对我来说很有意义.但是当传递给函数的值类型变量也会被复制时,这会让我感到困惑.

将值类型变量传递给函数时如何复制?什么样的"空间"持有这个副本?它是在场景后面无形地创建的某种临时变量,在函数进程被破坏之后?

谢谢

Rob*_*Rob 3

将值类型传递给函数时,可以将其想象为将其分配给作用域为该函数的局部变量,因此复制行为类似于分配新的局部变量。

关于复制到哪里,我们应该认识到复制行为实际上比听起来更复杂。正如他们在《Building Better Apps with Value Types in Swift》(WWDC 2015,Session 414)中指出的,“副本很便宜”:

复制低级基本类型需要恒定时间

  • IntDouble, ETC。

复制值类型的结构体、枚举或元组需要常量时间

  • CGPoint, ETC。

可扩展的数据结构使用写时复制

  • 复制涉及固定数量的引用计数操作

  • StringArraySetDictionary, ETC。

关于最后一点,Swift 在幕后做了一些花招,避免每次引用可扩展值类型时都复制它们,而只是指向原始引用,但跟踪有多少引用,并且实际上只制作副本( a) 写入时;其中 (b) 有多个引用。该视频中更详细地讨论了这种行为。