2017-10-15 20 views
0

私が取り組んでいるプログラムでは、単語を含む出力配列が入力配列と同じかそれより小さい文字列操作を行っています。たとえば、入力配列には100要素が含まれ、各要素は1語(可変長)です。操作後、99要素しかありませんでした。たとえば、入力配列が500バイトであるとします。 Swiftに出力配列の長さが少なくとも500バイトであることを確認して、要素を追加するときに要素の複数の空間を持つ別の部分にそれらを移動する必要がないようにすることはできますか?配列の容量をSwiftのバイト数で定義します。

答えて

0

誤解があるかもしれません。 Arrayにはあるタイプの値Tが格納され、これらの値はすべて同じサイズの です。あなたのケースでは、タイプ[String]の配列は、struct Stringの値 を保持します。これらの値は固定サイズです(Swiftの任意のタイプの値など)。

文字列は、実装の詳細で可変数の文字を保持する方法を管理します。 Swiftのソースコードを調べると、struct Stringには が実際の文字列ストレージへのポインタ(コピー時に 値セマンティクスを実装するためにカウントされた参照カウント)が含まれていることがわかります。

ですから、要素が追加されたときに、配列 再配分を避けるために、要素の与えられた数のためのスペースを確保することができます

var words: [String] = [] 
words.reserveCapacity(100) 

また場合再配分 を避けるために、文字列の基盤となるストレージのスペースを確保することができます

var word = "" 
word.reserveSpace(1000) 

しかし、あなたは、charの総数 を保持するために、アレイ内の容量を予約しない:文字列が拡張されその文字列要素のアクター。

+0

私は質問で間違いを感じましたが、可変長文字列の代わりに固定長文字が使用されています。 Woops。 – traisjames

+0

@traisjames:あなたは今、さまざまなものを混ぜていると思います。この配列は、固定長構造体である 'String'型の要素を格納します。各 'String'は、(不透明な)バッファを使用して、(多分可変の)文字数を保持します。それは総文字数のための容量を必要とする配列ではありません。 –

+0

@Martain R:ああ、文字列のメモリフットプリントは、格納されている文字数に制限されていませんか? – traisjames

関連する問題