Memory 0.5:より良いビルド システム、低レベル アロケーター、BlockAllocator、フィードバックが必要です

前回のリリースは長い時間がかかったと思っていましたが、今回は変更が少ないためにさらに時間がかかりました!しかし、foonathan/memory がついにリリースされました.今回は、より良い高レベルを可能にするために低レベルになります.

foonathan/memory は、さまざまなメモリ アロケータとアダプタ クラスを提供するライブラリです。これらのアロケータは、新しい 565 を使用します。 STL の 578 よりも単純な概念 割り当ての側面をより適切に制御できます。アダプターと特性により、既存のモデルとの互換性が確保され、STL またはその他のコンテナーでの使用が可能になります。

より良いビルド システム

しかし、最初に、改善されたビルド システムについて話しましょう。私は、インストールを許可して 587 を与えるために、さまざまな CMake ドキュメントとチュートリアルを掘り下げるのに何時間も費やしました。 サポート。

ライブラリは以前と同様に CMake サブディレクトリとして使用できますが、594 経由でインストールすることもできます。 これにより、システム全体のすべてのヘッダーとビルド ライブラリ ファイルがインストールされます。その後、独自のコンパイラ/ビルド システムで使用するか、CMake の 600 を呼び出すことができます。 :

add_executable(my_exe ...)

find_package(foonathan_memory 0.5 REQUIRED)
target_link_libraries(my_exe PRIVATE foonathan_memory)
# somehow activate C++11 for your target

これにより、複数のバージョンと構成をインストールすることもできます。特定の構成は 611 によって決定されます。 、各ビルド タイプは異なる構成を持つことができます (そしてそうあるべきです)。デバッグ オプションは、CMake ビルド タイプ 624 に対して固定されています。 、 630641 ただし、任意のビルド タイプまたは独自のビルド タイプに設定できます。

十分にテストしていません。問題が発生した場合はご連絡ください。

短いインクルード プレフィックスを使用する機能を削除したことに注意してください。654 を指定する必要があります。 ヘッダーを取得します。

また、私のネームスペース エイリアスの投稿に対するいくつかのフィードバックの後、エイリアスを自動的に提供するオプションを削除しました。ヘッダー ファイル 666 を含める必要があります。

これらは、リリースにおける唯一の破壊的変更です。

低レベルのアロケーター

ライブラリでは、低レベルのアロケーターと高レベルのアリーナの 2 種類のアロケーターを区別しています。

アリーナ アロケータは巨大なメモリ ブロックを取り、何らかの方法でそれらを細分化します。例は 670 です。 と 682 .低レベルのアロケータは、OS の機能などを直接使用してメモリを割り当てます。また、すべての低レベルのアロケータは、690 の型として使用できます。 .707 アリーナの巨大なメモリ ブロックのデフォルトの選択です。

0.4 では、2 つの低レベル アロケータがありました:712727 を使用して割り当てます 、および 736742 を使用して割り当てます .0.5 では、さらにいくつかの変更があります:

  • 758 まだ 762 を使用しています
  • 779 780 のような OS 機能を使用するようになりました Windows で
  • 新しい 795 800 を使用します 各プラットフォームで標準ライブラリを使用
  • 新しい 812 仮想メモリ割り当てを使用する
  • 新しい 821 割り当てに固定サイズの配列を使用する

834 844 へのポインタを取ります ストレージ バッファはどこにでも配置できますが、通常のスタックに配置すると、スタック メモリを処理するアロケータができます。これを使用して、ヒープをまったく使用しない STL コンテナを使用できます。 .

仮想メモリの割り当てとヒープの割り当てについては、直接使用できる小さな API を指定しました。ヒープの割り当ては 858 を介して行われます。 と 862877 を超える仮想メモリ割り当て .後者の関数は、単一または複数のメモリ ページでのみ機能し、885 にマップされます。 または 895 .907910 関数を呼び出すその上にある小さなラッパーです。

BlockAllocator と memory_arena

923 937 を呼び出すだけです 直後に 945 が続きます メモリ要求を満たすために必要なページの最小数について.私は同意します,それはかなり役に立ちません.

ただし、バリアント 957 ではありません .

高レベルのアリーナ アロケータは巨大なメモリ ブロックで動作します。0.4 では、通常の 961 しか指定できませんでした。 これはブロック割り当てを実行しますが、新しいメモリ ブロックを割り当てる必要があるときの動作を制御できませんでした。

970 を導入しました .単純な 986 次のように見えます:

class block_allocator
{
public:
 block_allocator(std::size_t block_size)
 : block_size_(block_size) {}
 
 memory_block allocate_block()
 {
 auto mem = ::operator new(block_size_);
 return {mem, block_size_};
 }
 
 void deallocate_block(memory_block b)
 {
 ::operator delete(b.memory);
 }
 
 std::size_t next_block_size() const
 {
 return block_size_; 
 }
 
private:
 std::size_t block_size_; 
};

これは方法を指定するだけではありません メモリは割り当てられますが、どのくらい .メモリ ブロックのサイズは完全に実装次第であり、常に同じ (ここのように)、2 倍、3 倍、まったく拡張できないなどの可能性があります。さらに、996 スタックのような方法で割り当てを行い、常に最後に割り当てられたブロックが与えられます。

新しいクラス 1002 アダプターは 1016 を取ります これを使用してメモリ ブロックを割り当て、それぞれのサイズを 2 倍にします (これは以前と同じです)。テンプレート マジックにより、1027 を渡すときに アリーナ アロケーターへのテンプレート パラメーターとして、1039 にラップされます。 .これにより、 1047 を使用できます どこでも 1053 が必要です。したがって、デフォルトのアロケータは実際には 1065 になります。 .

アダプター 1075 同様に動作しますが、成長を許可せず、例外をスローします。アリーナの成長を防ぐために使用できます。

しかし、真の力は、カスタマイズされたブロック アロケータを記述するときに発揮されます。1084 それを使用します。ブロック サイズと割り当てるべきブロック数を受け取ります。次に、1095 用に適切なページ数を予約します。 、1100 への各呼び出し 1111 の適切な数のページをコミットするようになりました トップポインタを前方に移動 1123 一番上のブロックを decommit します。これは 1138 のように振る舞います ただし、バイトではなくブロック/ページです。

1141 の力 s は、独自のアリーナ アロケーターを作成するときに使用できますが、直接使用することはお勧めしません。代わりに、クラス テンプレート 1151 ほぼ同じインターフェイスといくつかの追加機能を提供しますが、既に割り当てられているメモリ ブロックを格納し、デストラクタでそれらの割り当てを解除します。オプションで、1164 を呼び出す代わりにブロックをキャッシュすることもできます。 1175 で 、これにより、その後の割り当てがおそらく速くなります。

その他の変更

1185 の力 改善された 1193 完全にインスタンス化された型を取り、 1208 を再バインドします 1211 も通知するプロキシに使用します これは完全にエクストラッシブに機能し、1220 を取ることができる限り、独自のアリーナ クラスに使用できます。 テンプレート パラメータとして。

これは一連の特性 1237 によって可能になりました 1243 です テンプレートマジックを使用して、特定のタイプが 1254 であるかどうかを判断します または 1268 - 特殊化は必要ありません (通常)。この特性により、いくつかの 1273 を配置することもできました。 s が配置され、より適切なエラー メッセージとコンセプト チェックが可能になります。

また、いくつかの新しい派生例外クラスと、オプションで最も一般的なインスタンス化用の extern テンプレート (1284 など) を追加しました。 または 1297 そしてすべての 1306 ライブラリ アロケータ用)。

ポリモーフィック メモリ リソース TS 用のラッパーとアダプターもあり、両方向で機能します。ベース 1313 基本クラスを独自の型に設定して、たとえば Boost の実装と共存させることができます。

ドキュメントについて

さて、ドキュメンテーションは…

それは大丈夫ですが、間違いなく改善される可能性があります.参照部分は使用できますが、より多くの例、より良い紹介などが必要です.

彼らは来るでしょう、私はリリース前にそれを手に入れていなかったので、皆さんをこれ以上待たせたくありませんでした.

現在のドキュメントはここにあります。

今後の予定は? - フィードバック リクエスト!

必須機能のリストはかなり短くなりました。しかし、ターゲット ユーザー (あなた!) のすべてのニーズを把握しているわけではありません。その機能や他のライブラリの作業にすべての時間を費やしたので、それらを使用することはできません。何かが欠けている/違う動作をするはずなので、あなたにとってはまったく役に立たないかもしれません.

ですから、私に連絡してください! ツイート、コメント、メール、共有、イシューの執筆、手紙の執筆、私の家へのハトの送付など、なんでも構いません。

教えてください:

  • ライブラリを (すでに) 使用していますか?
  • 「いいえ」の場合:なぜですか?/どんなくだらないことなのか.
  • 「はい」の場合:いかがでしたか?何のために使用していますか?
  • 何を追加する必要がありますか?
  • 何を改善すべきですか?
  • うまくいかないことは何ですか?
  • 遅すぎるとは?
  • バギーとは?

あなたが私に教えてくれるほど、私はあなたのためにできることが増えます。あなたが私に教えてくれるほど、ライブラリは 1.0 リリースでより良くなります!