malloc()用来跟踪分配大小的空间
The space that malloc() used to keep track of allocated size
malloc()
函数会在返回点之前的8个字节(在64位系统中)中放入一些信息——一些关于缓冲区大小的信息。但有一些差异,这比我预期的要大。
char *p = (char*)malloc(0x12345678);
前面的8个字节显示数字0x12346002
(gdb) x/32ubx p-8
0x7fffe56cf008: 0x02 0x60 0x34 0x12 0x00 0x00 0x00 0x00
0x7fffe56cf010: 0x68 0x65 0x6c 0x6c 0x6f 0x20 0x77 0x6f
0x7fffe56cf018: 0x72 0x6c 0x64 0x0a 0x00 0x00 0x00 0x00
0x7fffe56cf020: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
想知道为什么有这么大的差异
malloc()
函数会在返回点之前的8个字节(在64位系统中)中放入一些关于缓冲区大小的信息。
尽管这是实现内存管理例程的一种非常常见的方式,但它并不是通用的;例如,库可以保留一个单独的哈希表来跟踪分配大小。该标准允许库选择其首选的实现方法。
前面的8个字节显示数字0x12346002
暂时假设插入分配地址之前的8个字节不是未定义的行为(而实际上是)。为了优化潜在的realloc
s,库可以根据自己的意愿对数字进行四舍五入。在这种情况下,库决定额外分配2442个字节,以备以后决定使用realloc
。
想知道为什么有这么大的差异
虽然从绝对数字来看,2442是一个很大的数字,但相对于分配的总体规模来说,这是一个很小的数字。
相关文章:
- STL算法和back_inserter可以预分配空间吗?
- 如何为结构字段动态分配字符空间
- 任务管理器 - C/C++ 应用程序 - 分配的地址空间与已用内存
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- 为什么我只能在 4 GB 的虚拟内存空间上分配 2 GB?
- 无法在命名空间范围内分配变量
- 将空间分配给整数指针时出错
- 将节点添加到链接列表中,而无需明确分配内存空间(无需使用新)
- 为阵列分配空间
- 如何为标准功能分配空间并做记忆
- 如何在不违反 const 限制的情况下动态分配模板类中的空间
- 只有当声明一个对象时,内存空间才会分配给类的数据成员,那么为什么 Sizeof(class_name) 给我结果
- 分配空间时,我会收到非常不同的地址
- 动态分配缓冲空间为二维数组 - 为什么失败
- C++内存分配/释放和自由空间错误
- 何时分配C++类的成员函数的内存空间
- 在C OS X中分配大空间
- 在名称空间之外的C 中的外部变量分配值
- 将动态空间分配给字符串数组时出现问题
- char*空间分配