2016-08-17 1 views
6

スイフトの文字列型は値型です。新しいString値を作成すると、そのString値は、関数またはメソッドに渡されるとき、または定数または変数に割り当てられたときにコピーされます。値の型付き変数を関数に渡すと、このコピーはどのように保持されますか?

定数または変数に割り当てるとコピーされますが、これは意味があります。しかし、値型の変数が関数に渡されると、関数もコピーされます。これは私を混乱させます。関数に変数を入力した値を渡すときに

質問

それがコピーされますどのように?どのような "スペース"がこのコピーを保持していますか?シーンの背後に目に見えない形で作成された一時的な変数の一部であり、機能のプロセスの後に破壊されますか?スウィフトで

答えて

2

値の型を関数に渡すときは、その関数をスコープとするローカル変数に値の型を割り当てるのと同じように考えると、コピーの振る舞いは新しいローカル変数を割り当てることに似ています。

コピー先については、コピー動作が実際よりも複雑であることを認識する必要があります。彼らはBuilding Better Apps with Value Types in Swift (WWDC 2015, Session 414)で指摘するように、 "コピーは安いです":

低レベルのコピー、基本的なタイプは、一定の時間である

  • IntDoubleなど

コピーA値型の構造体、列挙型、またはタプルは一定時間です

  • 拡張可能データ構造はコピーオンライト

    • コピーが参照カウント動作

    • StringArraySetDictionaryなどの固定数を伴う使用など

    。その最後の点については

は、舞台裏でスウィフトは、彼らが参照しているたびに拡張可能な値の型をコピー回避手のいくつかの早業を行いますが、むしろ、単に元の参照を指しますが、どのように多くのトラックを保持しますそこには参照があり、実際には書き込み時にのみコピー(a)を行います。 (b)複数の参照があります。この動作は、that videoでより詳細に説明されています。

+0

ご協力ありがとうございました。 – SLN

3

値型がコピーされます

おかげで、しかし、唯一のいくつかのマイナーな詳細が重複しますほとんどの場合、データの大部分は同じまま。 Stringという値を指定します。値を関数に渡すとき、charsバッファへの実際のポインタや長さのような情報がコピーされますが、実際のデータは単に渡されます。これは、Swiftの値渡しは高速な操作であることを意味します。

Swiftは、書き込みが必要であることを検出すると、実際のデータをクローンします。たとえば、配列がletからvarに渡された場合、大きなコピーは作成されません。しかし、新しい要素を追加して新しい配列を更新すると、その時点で配列内容の複製が作成され、そこに新しい要素が追加されます。

+0

ご協力ありがとうございました – SLN

関連する問題