Instance Method インスタンスメソッド

reserveCapacity(_:)

Reserves enough space to store the specified number of elements. 指定された数の要素を格納するのに十分な空間を確保します。

Declaration 宣言

mutating func reserveCapacity(_ minimumCapacity: Int)

Parameters パラメータ

minimumCapacity

The requested number of elements to store. 依頼された格納される要素数。

Discussion 解説

If you are adding a known number of elements to an array, use this method to avoid multiple reallocations. This method ensures that the array has unique, mutable, contiguous storage, with space allocated for at least the requested number of elements. あなたが数のわかった要素を配列に加えているならば、このメソッドを使って複数の再割り当てを避けてください。このメソッドは、配列が、少なくとも要請された数の要素に割り当てられた空間とともに、固有な、可変の、隣接するストレージを持つことを保証します。

Calling the reserveCapacity(_:) method on an array with bridged storage triggers a copy to contiguous storage even if the existing storage has room to store minimumCapacity elements. reserveCapacity(_:)メソッドをブリッジされたストレージを持つ配列で呼び出すことは、隣接ストレージへのコピーを引き起こします、たとえ既存のストレージにminimumCapacity要素を格納する余地があるとしてもです。

For performance reasons, the size of the newly allocated storage might be greater than the requested capacity. Use the array’s capacity property to determine the size of the new storage. 性能上の理由から、新しく割り当てられたストレージは要請された容量より大きいかもしれません。配列のcapacityプロパティを使って新しいストレージの大きさを特定してください。

Preserving an Array’s Geometric Growth Strategy 配列の幾何数級的増大戦略を守る

If you implement a custom data structure backed by an array that grows dynamically, naively calling the reserveCapacity(_:) method can lead to worse than expected performance. Arrays need to follow a geometric allocation pattern for appending elements to achieve amortized constant-time performance. The Array type’s append(_:) and append(contentsOf:) methods take care of this detail for you, but reserveCapacity(_:) allocates only as much space as you tell it to (padded to a round value), and no more. This avoids over-allocation, but can result in insertion not having amortized constant-time performance. あなたが動的に増大する配列によって裏打ちされる誂えのデータ構造を実装するならば、無邪気にreserveCapacity(_:)メソッドを呼び出すと予想される性能よりずっと悪くなります。ならし定数時間性能を達成するために、配列は要素を追加するのにある幾何数級的なアロケートパターンに従う必要があります。Array型のもつappend(_:)append(contentsOf:)メソッドは、この詳細をあなたの代わりに面倒を見ます、しかしreserveCapacity(_:)はあなたがそれに伝える(ある丸め値に詰め込まれた)のと同じ程度の空間だけをアロケートして、それ以上は何もしません。これは過度のアロケーションを防ぎます、しかし挿入においてならし定数時間性能を持たない結果になります。

The following code declares values, an array of integers, and the addTenQuadratic() function, which adds ten more values to the values array on each call. 以下のコードは、整数の配列values、そして呼び出し毎に10個さらに値をvalues配列に加えるaddTenQuadratic()関数を宣言します。


  var values: [Int] = [0, 1, 2, 3]


  // Don't use 'reserveCapacity(_:)' like this
  func addTenQuadratic() {
      let newCount = values.count + 10
      values.reserveCapacity(newCount)
      for n in values.count..<newCount {
          values.append(n)
      }
  }

The call to reserveCapacity(_:) increases the values array’s capacity by exactly 10 elements on each pass through addTenQuadratic(), which is linear growth. Instead of having constant time when averaged over many calls, the function may decay to performance that is linear in values.count. This is almost certainly not what you want. reserveCapacity(_:)を呼び出すことは、values配列の容量を正確に10要素ずつaddTenQuadratic()が行われる各々で漸増します、それは線形成長です。多くの呼出しの全体を平均したとき定数時を持つのではなく、values.countにおいて線形である性能を関数が衰えさせるかもしれません。これはほとんど疑いなくあなたが望むことではありません。

In cases like this, the simplest fix is often to simply remove the call to reserveCapacity(_:), and let the append(_:) method grow the array for you. このような場合に、最も簡単な修正はしばしば単純にreserveCapacity(_:)の呼出しを取り除いて、そしてappend(_:)メソッドがあなたの代わりの配列を成長させるようにしてください。


  func addTen() {
      let newCount = values.count + 10
      for n in values.count..<newCount {
          values.append(n)
      }
  }

If you need more control over the capacity of your array, implement your own geometric growth strategy, passing the size you compute to reserveCapacity(_:). あなたがあなたの配列の容量に関してより制御を必要とするならば、あなた独自の幾何数級的戦略を実装して、あなたが算出する大きさをreserveCapacity(_:)に渡してください。

Complexity: O(n), where n is the number of elements in the array. 計算量:O(n)、ここでnは配列の中の要素数です。

Relationships 関係

From Protocol 由来プロトコル