stdlib (gcc -nostdlib -nostartfiles) なしで C++ を使用して汎用コンテナーを作成する方法を見つけようとしています。私は最初にそのような問題に遭遇しました。どうすればそれができるかさえ考えられません。「新しい演算子」なしで、手動で std::vector のようなものが必要です。append()、at()、remove() 関数だけのソースを教えてもらえますか? ありがとうございました!
よろしく。
ガイドラインとして std::vector (動的コンテナーを探している場合) または std::array を使用する必要があると思います。
また、完全なメモリ管理 (プラットフォーム固有であるため、C++ メモリ演算子が必要ない場合はここに問題があります)、テンプレート化されたクラス (ここでもガイドラインとして std::vector を使用します) を見ていると思います。 )。
さまざまなコンストラクター、演算子、イテレーターなどを調べて、デザイン パターンやスタック オーバーフローに関する非常に貴重な情報を見つけることができます。
たとえば、追加は、連続したブロックを持つように、追加のメモリを順番に割り当てることを意味します (これも、プラットフォームに依存しますか?) 。
At では、境界とメモリのチェックを使用して、何らかの形式の簿記または索引付けを使用する必要があります。
追加と同じものを 1 つ削除します。
これがあなたの助けになることを願っています。
編集:あなたのコメントに答えるために。
テンプレートを使用する (std::vector など) 場合、型を気にする必要はありません。メモリを管理するのはクラス (または型) の責任です。
たとえば、Win32 でできることは次のとおりです。
template<class _Ty>
class w32Allocator
{
// deallocate object at _Ptr, ignore size
void deallocate(pointer _Ptr, size_type)
{
VirtualFree(_Ptr, 0, MEM_FREE);
}
// allocate array of _Count elements
pointer allocate(size_type _Count)
{
return (pointer)VirtualAlloc(NULL, sizeof(_Ty) * _Count, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
}
};
注: 上記のコードは私のものではありません。バグがあるかどうかはわかりません。この投稿から取得。この場合、Win32 ヒープ管理への低レベル C 呼び出しを管理しています。これはトリッキーな領域であることを覚えておいてください。
次に、タイプ _Ty の配列、つまり連続配列 (非動的) の場合のみ心配する必要があります。
_Ty array[number_of_objects];
または、リンクされたリスト (各ノードにオブジェクトへのポインターと次のノードへのポインターがある) を調べることもできますが、これは継続的なメモリ パフォーマンスを低下させる可能性があります。
最初の停止は、さまざまなメモリ管理演算子を実装することです。おそらく and の観点からですmalloc()
(free()
これらの演算子も使用できない場合、事態はさらに興味深いものになります)。
void* operator new(std::size_t size) {
return malloc(size);
}
void* operator new[](std::size_t size) {
return malloc(size);
}
void operator delete(void* ptr) {
free(ptr);
}
void operator delete[](void* ptr) {
free(ptr);
}
これらを取得したら、通常どおりメモリの割り当てを開始できます。あなたが要求した小さな一連の操作でイベントを書くstd::vector<T>
ことは、簡単な練習になるはずです。ただし、使用at()
は悪い考えであることに注意してください。一般に、エラーを覆い隠す広いインターフェイスは、解決策というよりも問題です。