如何在glibc库中找到malloc分配的chunk大小?
How to find the size of chunk allocated by malloc in the glibc library?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char * ptr1 = NULL;
char * newptr = NULL;
ptr1 = (char *) malloc(8 * sizeof(int));
if (ptr1 == NULL)
exit(EXIT_FAILURE);
printf("%p\n", ptr1);
newptr = ptr1 - sizeof(size_t);
printf("%zu\n", (*(size_t *)newptr));
free(ptr1);
return 0;
}
输出:
0x...... [some address]
49
49 - 1 = 48 - (8 * 4) = 16
假设 sizeof(int)
= 4
根据 glibc
malloc()
实现,每个块的最大开销是 8 bytes
但是这个块字段的大小给出 48
减去可用内存给出 16
。所以开销显示 16 bytes
。
我知道出了点问题,但我无法弄清楚我在哪里做错了计算。
请帮忙。谢谢。
这是 implementation-defined 你不应该乱搞的东西之一,除了实验或研究目的。
在 GNU 平台中,non-C-standardheadermalloc.h
中存在一个名为 malloc_usable_size()
的函数,它将告诉您 [=12] 的实际 byte-length =]ed 堆块给出了一些指针,该指针是 malloc()
的 return 值,但在它自己的 documentation 中它说“虽然多余的字节可以被覆盖没有不良影响的应用程序,这不是好的编程习惯:分配中的多余字节数取决于底层实现。"
根据 C-standard,malloc()
分配的内存块只能保证您要求的字节数,但实际上大多数(如果不是全部)实现会给您一些额外的填充或内存管理器的目的。我记得我的一位计算机科学教授在她的系统上演示了如何在指针从 malloc()
传递之前查看内存,就像读取有关内存块的信息一样,但 C 编程语言确实如此不需要 malloc()
以这种方式实现,也不保证任何此类数据将如何编码。
您似乎使用的是 GNU,所以如果您想了解更多关于 malloc()
在您的平台上是如何实现的,请看一看 malloc_usable_size()
看看它是否真的给了您 48当您要求 32 字节时。为了记录,如果是这样,我一点也不会感到惊讶。
当你说 glibc 中的最大开销是 8 字节时,我不确定你指的是什么。这可能意味着堆管理器为每个块使用的最大内存为 8 字节,不包括为对齐分配的额外内存?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char * ptr1 = NULL;
char * newptr = NULL;
ptr1 = (char *) malloc(8 * sizeof(int));
if (ptr1 == NULL)
exit(EXIT_FAILURE);
printf("%p\n", ptr1);
newptr = ptr1 - sizeof(size_t);
printf("%zu\n", (*(size_t *)newptr));
free(ptr1);
return 0;
}
输出:
0x...... [some address]
49
49 - 1 = 48 - (8 * 4) = 16
假设 sizeof(int)
= 4
根据 glibc
malloc()
实现,每个块的最大开销是 8 bytes
但是这个块字段的大小给出 48
减去可用内存给出 16
。所以开销显示 16 bytes
。
我知道出了点问题,但我无法弄清楚我在哪里做错了计算。
请帮忙。谢谢。
这是 implementation-defined 你不应该乱搞的东西之一,除了实验或研究目的。
在 GNU 平台中,non-C-standardheadermalloc.h
中存在一个名为 malloc_usable_size()
的函数,它将告诉您 [=12] 的实际 byte-length =]ed 堆块给出了一些指针,该指针是 malloc()
的 return 值,但在它自己的 documentation 中它说“虽然多余的字节可以被覆盖没有不良影响的应用程序,这不是好的编程习惯:分配中的多余字节数取决于底层实现。"
根据 C-standard,malloc()
分配的内存块只能保证您要求的字节数,但实际上大多数(如果不是全部)实现会给您一些额外的填充或内存管理器的目的。我记得我的一位计算机科学教授在她的系统上演示了如何在指针从 malloc()
传递之前查看内存,就像读取有关内存块的信息一样,但 C 编程语言确实如此不需要 malloc()
以这种方式实现,也不保证任何此类数据将如何编码。
您似乎使用的是 GNU,所以如果您想了解更多关于 malloc()
在您的平台上是如何实现的,请看一看 malloc_usable_size()
看看它是否真的给了您 48当您要求 32 字节时。为了记录,如果是这样,我一点也不会感到惊讶。
当你说 glibc 中的最大开销是 8 字节时,我不确定你指的是什么。这可能意味着堆管理器为每个块使用的最大内存为 8 字节,不包括为对齐分配的额外内存?