【发布时间】:2010-09-30 16:56:48
【问题描述】:
您将如何确定某个职位是否已被占用?分配内存时,其中的所有内容都是垃圾(在 C++ 中,这是我正在使用的 atm)。我正在考虑使用一个辅助的布尔数组来了解该位置是否被占用,但这需要相当多的额外内存。
我也可以为每个位置设置一个值,但是我将无法使用该值。在这两种情况下,我也会失去一些初始化值的性能(例如,布尔值为 false,其他值为 0 表示该位置是空闲的)。
还有其他解决方案吗?
【问题讨论】:
您将如何确定某个职位是否已被占用?分配内存时,其中的所有内容都是垃圾(在 C++ 中,这是我正在使用的 atm)。我正在考虑使用一个辅助的布尔数组来了解该位置是否被占用,但这需要相当多的额外内存。
我也可以为每个位置设置一个值,但是我将无法使用该值。在这两种情况下,我也会失去一些初始化值的性能(例如,布尔值为 false,其他值为 0 表示该位置是空闲的)。
还有其他解决方案吗?
【问题讨论】:
通常,您使用特殊的占位符元素来指示空值。在最简单的情况下,这可能是一个空指针,但这当然意味着您引入了间接;你不能直接存储你的值。在所有其他情况下,您必须考虑实际存储的类型。例如,如果您存储 32 位整数,则必须保留至少一个预定义值(例如 0)作为标记元素,从而减少可能存储在哈希表中的值范围。
带有标志的附加数组是一个很好的解决方案。考虑到通过存储位标志而不是全字节变量(甚至是布尔值,在大多数架构上每个都需要 4 个字节),这个数组可以减少至少 8 倍。
【讨论】:
您可以为此使用boost::optional,而不是原始值。这就是创建它的原因,为项目添加未初始化的值。它的性能损失类似于最初初始化值,但每个项目只需要少量的额外内存。
【讨论】: