2

タスクに最適なデータ構造を決定する際には、次の 3 つの考慮事項があります。

  • 機能性: データ構造は必要な操作を提供しますか?
  • パフォーマンス: これらの操作の速度
  • メモリ消費量: データ構造が使用するメモリ量

最初の考慮事項は、データ構造のインターフェイスをチェックすることで見つけることができます。2 番目の考慮事項は、ベンチマークでのみ測定できます。ただし、データ構造が現在使用しているメモリを計算するメソッドを提供するだけの場合、3 つ目は非常に単純ですが、それ以外の場合は困難です。

STL データ構造では、このような方法はありません。しかし、なぜ?STL のすべてのデータ構造に対してこのようなメソッドを実装するのは非常に簡単です。クライアントである私にとって、内部実装に精通している必要があるため、このようなメソッドを作成するのは非常に困難です。さらに、実装はプライベート メンバーの背後に隠されているため、まったくアクセスできません。

では、なぜ彼らは除外されたのでしょうか。現在、データ構造を選択する場合、現在リリースされている google btree 実装など、他の多くの実装がこれらのメソッドを提供しています。これらのデータ構造を比較するのは簡単です。ただし、メモリ消費に関して STL データ構造がどのように機能するかを尋ねるとき、私ができることは基本的に推測することだけです。

これらのメソッドを除外することが設計上の決定になる可能性がある理由を見つけることができません。さらに、C++ は、高いパフォーマンスと低いメモリ フットプリントを実現するように調整された言語です。特にそのような言語では、データ構造のメモリ消費量を評価することは非常に一般的なユースケースだと思います。ですから、誰も使わないから取り残されたとも思えません。さらに、STL は非常に成熟したライブラリでもあるため、その理由は、ライブラリがこれに対して十分に精巧ではないということでもありません。では、これらのメソッドを省略する理由は何でしょうか?

4

2 に答える 2

5

コンテナには、使用するメモリの量を知る方法がないため、グローバルです。含まれている要素の数を返す関数を持つことができます(実際にあります)std::vector。また、コンテナが全体的に割り当てられるような場合には、割り当てられた要素の数を示す関数(std::vector<>::capacity)があります。しかし、そのような割り当ての追加のオーバーヘッドを考慮に入れる方法はありません(そしていくつかあるはずです)。このようなオーバーヘッドは、アロケータに依存し、通常、アロケータが使用するさらに低いレベルの関数に依存します。最も低いレベルでは、これが何を意味するのかさえ明確ではありません。私がmalloc1バイトの場合malloc、実際には「割り当て」の概念に従って16を割り当てる可能性があります。しかし、 malloc1バイトを割り当てたときにプールに空きメモリがなかった場合、システムに送られ、メガバイト以上が割り当てられる可能性があります。では、この場合のメモリ使用量は何ですか:1バイト、16バイト、または1メガバイト以上ですか?

于 2013-03-03T22:07:05.757 に答える
1

しかし、なぜ?

彼らの仕事は純粋な抽象化だからです。std::vectorオブジェクトの配列を格納し、実装で現在消費しているバイト数を伝えるためのものではありませ。オブジェクトの配列のみを格納するためのものです。

この質問は、常に繰り返される「ポインタが指しているメモリの量を知るにはどうすればよいですか」という質問に非常に似ている(そしておそらく関連している)と思いますmalloc()。おそらく答えも同じです:あなたは自分自身を追跡する必要がありますもの。(不便かもしれませんが、それはまた別の質問です...)

于 2013-03-03T21:54:11.110 に答える