起始块存储的地址

时间:2014-07-14 08:15:46

标签: c++

  

分配函数尝试分配请求的数量   存储。   如果成功,它将返回a的开头地址   存储块,其长度以字节为单位至少一样大   要求的大小。

这种约束是什么意思?你能得到一个违反的例子吗?

看来,我的问题还不清楚。 UPD: 为什么"至少"?分配比请求大小更重要的是什么?你能得到合适的例子吗?

4 个答案:

答案 0 :(得分:5)

分配"超过要求的津贴"是允许的:

  1. 下一个数据块的良好对齐。
  2. 减少对哪些平台能够运行从C和C ++编译的代码的限制。
  3. 设计内存分配功能的灵活性。
  4. 第一点的一个例子是:

      char *p1 = new char[1];
      int  *p2 = new int[1];
    

    如果我们在地址0x1000处为第一次分配准确地分配1个字节,并且对于int,则完全遵循4个字节的第二个分配,int将从地址0x1001开始。这是有效的"在某些体系结构上,但往往会导致价值降低,而在其他体系结构上,它会直接导致崩溃,因为int无法访问地址,而不是{39}由于new的基础架构实际上并不知道最终将用于什么内存,因此最好将其分配到"最高的对齐",在大多数架构中意味着8或16个字节。 (如果内存用于存储SSE数据,则需要16字节的对齐)

    第二种情况是"指针只能指向32位字的整个块"。过去曾有类似的架构。在这种情况下,即使我们忽略上述对齐问题,通用指针指定的内存位置也是两部分,一部分用于实际地址,另一部分用于"该字内的字节"。在内存分配器中,由于典型的分配比单个字节大得多,我们决定只使用"全字"指针,因此所有分配都是按设计总是向上舍入到整个单词。

    例如,第三种情况是使用"预先调整大小的块"分配器。例如,某些实时操作系统将具有他们分配的固定数量的预定义大小 - 例如16,32,64,256,1024,16384,65536,1M,16M字节。然后将分配向上舍入到最接近的相等或更大的大小,因此将从1024大小分配257个字节。这里的想法是:a)通过跟踪每个大小的空闲块来提供快速分配,而不是传统模型中具有任意大小的大量块来搜索以查看是否存在足够大的块。它还有助于防止碎片化(当大量内存是" free",但是大小错误,因此无法使用 - 例如,如果运行循环直到系统内存不足,则分配64字节的块,然后互相释放,并尝试分配一个128字节的块,没有一个128字节块可用,因为所有内存都被分成几个64字节的部分)。

答案 1 :(得分:4)

这意味着分配函数应返回一个内存块的地址,该内存块的大小至少是您请求的大小 但是,大多数分配函数都应返回一个内存块的地址,该块的大小大于,而不是你请求的内存块,下一个分配将在块内返回一个地址直到它结束。
这种行为的主要原因是:

  1. 最大限度地减少新内存块分配的数量(每个块可以包含多个分配),这在时间复杂度方面很昂贵。
  2. 特定对齐问题。

答案 2 :(得分:3)

分配的两个最常见的原因
返回大于请求的块

  1. 对齐
  2. 簿记

答案 3 :(得分:2)

可能是这样的,因为在现代操作系统中,分配可能为512 kb的内存页是非常有效的。所以内部malloc功能可以只分配这个内存页面,从一些服务信息开始填写它分成多少个子块,它们的大小等等。然后只返回给你一个适合你需要的地址。接下来对malloc的调用将返回此分配页面的另一部分。内存块被限制为您请求的大小并不重要。实际上,由于没有安全机制来阻止这种活动,因此可以堆溢出此缓冲区。您也可以考虑其他响应者所述的对齐问题。有足够的内存管理类型。如果你有足够的兴趣,你可以google它(Best Fit,First Fit,Last Fit,如果我错了,请纠正我。)