你听说过 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];
};
那么,就是这么简单:
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]);
}
注意:为了简单起见,我没有考虑对齐问题。 如果您不了解这个主题,请在调整内存之前先阅读相关资料 :)
reinterpret_cast
如何使你忽略存储0
的两种不同原因? - Stephenx
是否在内存中被所有零表示吗? - Oliver CharlesworthT
用==
不相等,那么它们就不可能按位相等,至少对于任何有用的容器相等定义来说是这样。因此,在唯一的容器中(如果相等性是合理的话),不能有两个按位零元素。 - user319799