聞いたことがありboost::optional
ますか?
ここでの実際の問題については不明であることを認めなければなりません...しかし、boost :: optionは値で保存でき、実際のメモリが初期化されているかどうかを知ることができます。私はその場での建設と破壊も許可しているので、私が推測するのにぴったりかもしれません。
編集:
私はついに問題を理解したと思います。メモリ内のさまざまなポイントに多くのオブジェクトを割り当てられるようにし、この時点でのメモリが本当にオブジェクトを保持しているかどうかを知りたいのです。
残念ながら、ソリューションには大きな問題があります。それは正しくありません。T
どういうわけかビットパターンで表すことができればnull
、それはユニタライズされたメモリだと思うでしょう。
少なくとも1ビットの情報を追加するために自分自身に頼る必要があります。それほど多くはありませんが、結局のところ、それは成長の3%にすぎません(4バイトで33ビット)。
たとえば、いくつかのミミックboost::optional
を配列形式で使用できます(パディングの損失を回避するため)。
template <class T, size_t N>
class OptionalArray
{
public:
private:
typedef unsigned char byte;
byte mIndex[N/8+1];
byte mData[sizeof(T)*N]; // note: alignment not considered
};
次に、それはそれと同じくらい簡単です:
template <class T, size_t N>
bool OptionalArray<T,N>::null(size_t const i) const
{
return mIndex[i/8] & (1 << (i%8));
}
template <class T, size_t N>
T& OptionalArray<T,N>::operator[](size_t const i)
{
assert(!this->null(i));
return *reinterpret_cast<T*>(mData[sizeof(T)*i]);
}
注:わかりやすくするために、配置の問題については考慮していません。あなたが主題について知らないならば、記憶をいじる前にそれについて読んでください:)