为什么分配的内存不同于字符串的大小?

时间:2017-05-25 20:53:38

标签: memory

请考虑以下代码:

printf

当我使用一些printf("str[0] = '%p'\nstr[1] = '%p'\nstr[2] = '%p'\n", str[0], str[1], str[2]); 来打印每个指针的内存地址时:

str[0] = '0x1254030'
str[1] = '0x1254050'
str[2] = '0x1254080'

我得到了这个输出:

str[0]

我期望第二个地址对应的数字是第一个地址对应的数字和24之间的数字之和,它对应于字符串0x1254047的大小(以字符为单位) 1个字节)。考虑到这个数字用16(0123456789abcdef)表示,我预计第二个地址对应的数字为def buckets = ctx.payload.aggregations.metrics.buckets.sort((a,b) -> a.largest_surprise.value == b.largest_surprise.value ? 0 : a.largest_surprise.value < b.largest_surprise.value ? -1 : 1);

在我看来,我发现了一个模式:从一个字符串中的24个字符开始,对于其中包含的每16个字符,使用的内存大16个字节。例如,45个字符长的字符串使用64个字节的内存,77个字符长的字符串使用80个字节的内存,150个字符长的字符串使用160个字节的内存。

以下是模式的说明:

enter image description here

我想了解为什么分配的内存不等于字符串的大小。为什么会遵循这种模式?

2 个答案:

答案 0 :(得分:4)

至少有两个原因malloc()可能会以您注意到的方式返回记忆。

  1. 效率和表现。通过仅以一小组实际大小返回内存块,对内存的请求更有可能找到可以使用的已存在的内存块,或者最终生成可以在以下内容中轻松重用的内存块。未来。这将使请求返回更快,并且具有限制内存碎片的副作用。
  2. 内存对齐要求产生的影响 7.22.3 the C Standard状态的内存管理功能“连续调用分配的存储的顺序和连续性 aligned_alloccallocmalloc,和 realloc函数未指定。 的 如果分配成功,则返回指针,以便可以将其分配给 指向具有基本对齐要求的任何类型对象的指针 ...“注意斜体部分。由于malloc()实现不知道要使用的内存,返回的内存有适合任何可能使用。这通常意味着8或16字节对齐,具体取决于平台。

答案 1 :(得分:3)

三个原因:

(1)字符串“ABC”包含4个字符,因为C中的每个字符串都必须有一个终止'\ 0'。

(2)许多处理器都有内存地址对齐问题,当malloc()分配的任何块在4或8的倍数或任何“自然”内存大小的地址上启动时,它会最有效。

(3)malloc()函数本身需要一些内存来存储有关已分配内容的信息,以便free()知道该怎么做。