2017-01-15 2 views
0

Redditの "learnprogramming"サブ(source)にこのコードがあります。このタイプのメモリ管理のユースケースはありますか?

著者は、宣言されていないユースケースに最適であると主張しています。しかし私は個人的に考えることができません。私は、システムヒープではなく、固定サイズのオブジェクトの内部で行われている点を除いて、ダイナミックメモリ割り当てのように見えるとコメントしたいくつかの他のポスターに同意する傾向があります。しかし、私は心を開いて、奇妙なユースケースを見落としてしまったと考えています。

実際にこのタイプのオブジェクトのユースケースがありますが、その中に「パーキングカー」(オブジェクトの割り当て)がランタイムスタックまたはヒープに直接割り当てるよりも良いでしょうか?

template <typename T, size_t SIZE> 
class CarPark { 

    public: 
    CarPark() { 
     // Setup initial free spaces 
     for (size_t i = SIZE; i > 0; --i) { 
     mFreeSpaces.push(i - 1); 
     } 
    } 

    const size_t& Park(const T* const t) { 
     size_t ticket = mFreeSpaces.top(); 
     mSpaces.at(ticket) = t; 
     mFreeSpaces.pop(); 
     return ticket; 
    } 

    const T* const DePark(size_t ticket) { 
     const T* const result = mSpaces.at(ticket); 
     mSpaces.at(ticket) = nullptr; 
     mFreeSpaces.push(ticket); 
     return result; 
    } 

    private: 
    std::array<const T*, SIZE> mSpaces { { nullptr } }; 
    std::stack<size_t> mFreeSpaces; 

}; 
+1

'const T *'を 'int'に置き換えた場合、これについて考えると助けになるかもしれません。 –

+0

'std :: stack'に加えて、そのスペース内でサイズを変更して固定サイズを使うことは' constexpr'関数にとって有益です。たとえば、最大サイズのスタックは 'constexpr'で使用できます。 – chris

+0

これは実際にはダイナミックメモリの割り当てと同じです。これはポインタをsize_tsに戻して戻す単なる方法です。著者のケースでは、それは彼がワイヤーを介してsize_tを送信し、それを取り戻し、それを使ってオブジェクトをルックアップできるようにしていました。それはその問題の良い解決策です。 (実際にはより安全なチェックが必要です) –

答えて

1

駐車場スペースの連続バイトの一定の数を事前に割り当てます。 少なくとも2つのユースケースを見ることができます:

1>スペースの地域性:...少なくとも車のスペースについて(コメントを参照)CarParkが車を直接スペースに入れると、次のような利点が利用可能な場合があります:あなたの車をヒープメモリ空間の擬似ランダムな場所に格納するのではなく、すべての車が緊密に詰め込まれます。つまり、すべての車を繰り返したり、メモリスペースを解放することは迅速になります。これはキャッシュにやさしいでしょう。

2>可能性のあるマルチスレッドアプリケーション:私が理解しているように、デフォルトのアロケータはマルチプログラミングにはあまりあてはまりません(私が間違っていれば私を修正してください。他の要求を取る前に個々のメモリ要求を完了する必要があるので、複数のスレッドを使用して特定の車を駐車したい場合は、何の意味もありません。すべての割り当てがあらかじめ行われているので、複数のスレッドがカーを駐車することができます(もちろん、必要なマルチスレッドセーフなセクションを実装する必要があります)。

3>コメント参照:ローカルより効率的にすることができる固定 サイズ要素を管理、割当オーバヘッドが大きい場合に

を。 en.wikipedia.org/wiki/Slab_allocation - リッチ

理想的な場合には、あなたがプログラムを駐車する必要がありますどのように多くの車の平均(または正確に)上知っているだろう。そうすれば記憶が無駄にならないでしょう。

これは単なる私の考えです。私は他の答えも見るのが好奇心です。

+1

割り当てオーバーヘッドが重要な場合、固定サイズの要素をローカルで管理する方が効率的です。 https://en.wikipedia.org/wiki/Slab_allocation – Rich

+1

「車」の「スペース」には空間的なローカリティがありますが、「車」はありません。 'CarPark'は' T'オブジェクトを割り当てませんので、(1)でリストした利点は利用できません。 – 1201ProgramAlarm

+0

@ 1201ProgramAlarm私の編集はあなたが言ったことを適切に反映していますか?私の答えを自由に編集してください。 – synchronizer

関連する問題