你听说过boost::optional
吗?
我必须承认我不清楚这里的真正问题......但是 boost::optional 允许按值存储,但知道实际内存是否已初始化。我也允许就地建造和破坏,所以我猜这可能是一个很好的选择。
编辑:
我想我终于抓住了这个问题:您希望能够在内存中的各个点分配大量对象,并且您想知道此时的内存是否真的保存了一个对象。
不幸的是,您的解决方案有一个大问题:它不正确。如果T
可以以某种方式用null
位模式表示,那么您会认为它是未初始化的内存。
您将不得不自己添加至少一点信息。真的不多,毕竟这只是增长的 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]);
}
注意:为简单起见,我没有考虑对齐问题。如果您不了解该主题,请在摆弄内存之前先阅读一下:)