0

stdlib (gcc -nostdlib -nostartfiles) なしで C++ を使用して汎用コンテナーを作成する方法を見つけようとしています。私は最初にそのような問題に遭遇しました。どうすればそれができるかさえ考えられません。「新しい演算子」なしで、手動で std::vector のようなものが必要です。append()、at()、remove() 関数だけのソースを教えてもらえますか? ありがとうございました!

よろしく。

4

2 に答える 2

1

ガイドラインとして 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];

または、リンクされたリスト (各ノードにオブジェクトへのポインターと次のノードへのポインターがある) を調べることもできますが、これは継続的なメモリ パフォーマンスを低下させる可能性があります。

于 2013-09-26T17:56:20.937 に答える
0

最初の停止は、さまざまなメモリ管理演算子を実装することです。おそらく 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()は悪い考えであることに注意してください。一般に、エラーを覆い隠す広いインターフェイスは、解決策というよりも問題です。

于 2013-09-26T16:00:58.013 に答える