首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >起始块存储地址

起始块存储地址
EN

Stack Overflow用户
提问于 2014-07-14 08:15:45
回答 4查看 449关注 0票数 5

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

这种限制意味着什么?你能举个例子吗?

看来,我的问题还不清楚。UPD:为什么“至少”?比所要求的大小更多的分配有什么意义?你能找出合适的例子吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-14 08:48:37

分配“超出要求”的津贴是为了:

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

第一点的例子是:

代码语言:javascript
复制
  char *p1 = new char[1];
  int  *p2 = new int[1];

如果我们在地址0x1000处为第一个分配分配准确的一个字节,然后再为一个int分配4个字节,那么int将从地址0x1001开始。这在某些体系结构上是“有效的”,但通常会导致“较慢的值加载”,而在其他体系结构上,它将直接导致崩溃,因为在一个地址上不能访问int,而该地址甚至不是4的倍数。由于new的底层体系结构实际上并不知道内存最终将用于什么,所以最好以“最高对齐”的方式分配内存,在大多数体系结构中,这意味着8或16字节。(例如,如果内存用于存储SSE数据,则需要对齐16字节)

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

例如,第三种情况是使用“预大小块”分配器。例如,一些实时操作系统将分配固定数量的预定义大小,例如16、32、64、256、1024、16384、65536、1M、16M字节。然后,分配被舍入到最接近的相等或更大的大小,因此将从1024大小分配257个字节。这里的想法是( a)提供快速分配,方法是跟踪每个大小的空闲块,而不是传统的模型,即有大量任意大小的块来搜索,以查看是否有足够大的块。它还有助于防止碎片(当大量内存“空闲”,但大小错误时,不能使用--例如,如果运行一个循环直到系统耗尽分配64字节块的内存,然后释放另一个内存块,然后尝试分配一个128字节块,则不会有一个128字节块空闲,因为所有内存都被分割成了64个字节的小部分)。

票数 5
EN

Stack Overflow用户

发布于 2014-07-14 08:28:20

这意味着分配函数将返回一个内存块的地址,该内存块的大小至少与您所请求的大小相同。

然而,大多数分配函数都应该返回一个内存块的地址,该内存块的大小要大于所请求的内存块,下一次分配将返回该块内的一个地址,直到该地址到达该块的末尾为止。

造成这种行为的主要原因是:

  1. 尽量减少新内存块分配的数量(每个块可以包含几个分配),就时间复杂性而言,这是昂贵的。
  2. 具体的对齐问题。
票数 4
EN

Stack Overflow用户

发布于 2014-07-14 08:58:09

分配的两个最常见的原因

返回大于请求的块是

  1. 对齐
  2. 簿记
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24732181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档