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;
};
'const T *'を 'int'に置き換えた場合、これについて考えると助けになるかもしれません。 –
'std :: stack'に加えて、そのスペース内でサイズを変更して固定サイズを使うことは' constexpr'関数にとって有益です。たとえば、最大サイズのスタックは 'constexpr'で使用できます。 – chris
これは実際にはダイナミックメモリの割り当てと同じです。これはポインタをsize_tsに戻して戻す単なる方法です。著者のケースでは、それは彼がワイヤーを介してsize_tを送信し、それを取り戻し、それを使ってオブジェクトをルックアップできるようにしていました。それはその問題の良い解決策です。 (実際にはより安全なチェックが必要です) –