【问题标题】:Bit-Mapped Memory Manager位图内存管理器
【发布时间】:2019-11-30 14:22:56
【问题描述】:

我正在阅读有关为 c++ 程序编写内存管理工具的教程。这是教程的link

此内存管理器的一个变体是位映射内存管理器,其中优化基于预取一大块内存并稍后在我们的程序中使用它的想法。 该块进一步分为更小的固定大小的单元,称为块,用于分配特定类型的对象。

教程中明确提到,“所有空闲块的相应位都设置为 1。占用的块将其位重置为 0。”

与每个块相关联的位图表示上述想法。但是,在 BitMap 类的实现中,每个块的每个对应位都由一个 32 位整数表示,而不仅仅是一个布尔值。这是我无法理解的。

另外,下面是上述类的声明。您可以在本教程的清单 12 中看到这一点。我也认为 memset 的行不正确。初始化是不完整的,应该是 BIT_MAP_SIZE*4 就算我们走他们的路。

typedef struct BitMapEntry
{
  int Index;
  int BlocksAvailable;
  int BitMap[BIT_MAP_SIZE];

  public:
    BitMapEntry(): BlocksAvailable(BIT_MAP_SIZE)
    {
      memset(BitMap, 0xff, BIT_MAP_SIZE / sizeof(char)); 
      // initially all blocks are free and bit value 1 in the map denotes 
      // available block
    }

    void SetBit(int position, bool flag);
    void SetMultipleBits(int position, bool flag, int count);
    void SetRangeOfInt(int* element, int msb, int lsb, bool flag);

    Complex* FirstFreeBlock(size_t size);
    Complex* ComplexObjectAddress(int pos);

    void* Head();
}
BitMapEntry;

【问题讨论】:

    标签: c++ memory-management


    【解决方案1】:

    初始化似乎确实不正确,但选择“位容器”类型为int 不一定无效。

    你看,C++ 没有原生位类型;在典型的计算机上-您无法解决单个位。

    可能会发生什么(并且您还没有展示使用实现),因为每个 int 都可以是 sizeof(int) * CHAR_BIT 位的容器,因此如果您询问位置 k,您将寻找在k / sizeof(int) * CHAR_BIT) 整数中的k % (sizeof(int) * CHAR_BIT)

    【讨论】:

    • 您能否详细说明如何使用 int 仍然有效?另外,如果我们正在查看 k/32 整数中的 k%32 位,我们是否有充分的理由不使用其他 31 位?另外,您希望看到哪种实现方式?
    • 我们使用它的所有 32 位(假设它是 32 位;顺便说一句,情况并非总是如此)。 k 位置的位是 BitMap[k / (sizeof(int) * CHAR_BIT)] >> (k % (sizeof(int) * CHAR_BIT)) & 0x1
    • 我理解上面的数学,但我想问的是,“这些 32 位的用途是什么?而不是仅仅一个?”。
    • @PiyushKansal:1. 你不能只有一个——无论是在语言方面,还是在通用硬件方面。 2. 复制和初始化时有一个小的对齐好处。
    • 我现在明白了。感谢您的热心帮助。
    猜你喜欢
    • 2012-02-22
    • 2023-04-08
    • 1970-01-01
    • 2016-01-31
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2013-11-19
    相关资源
    最近更新 更多