malloc边界大小:是否存在性能差异
我在C上的初学者课程中有这样一个注释:在x86机器上,malloc边界大小:是否存在性能差异,c,malloc,C,Malloc,我在C上的初学者课程中有这样一个注释:在x86机器上,malloc返回指向与16字节边界对齐的块的指针 这是否意味着调用malloc(1)没有任何优势,即性能与调用malloc(16)没有区别?每次调用malloc都不需要向操作系统请求内存。它会询问操作系统何时需要内存上的大卡盘,然后分配一点给您。在未来的呼叫中,它将有那个位空闲,并且可以将它分配给您,而无需询问操作系统 因此,它将分配方便处理器使用的内存—通常是对齐的 您应该只分配所需的内存,然后让malloc整理剩余的内存。对malloc的
malloc
返回指向与16字节边界对齐的块的指针
这是否意味着调用
malloc(1)
没有任何优势,即性能与调用malloc(16)
没有区别?每次调用malloc
都不需要向操作系统请求内存。它会询问操作系统何时需要内存上的大卡盘,然后分配一点给您。在未来的呼叫中,它将有那个位空闲,并且可以将它分配给您,而无需询问操作系统
因此,它将分配方便处理器使用的内存—通常是对齐的
您应该只分配所需的内存,然后让
malloc
整理剩余的内存。对malloc
的每次调用都不需要它向操作系统请求内存。它会询问操作系统何时需要内存上的大卡盘,然后分配一点给您。在未来的呼叫中,它将有那个位空闲,并且可以将它分配给您,而无需询问操作系统
因此,它将分配方便处理器使用的内存—通常是对齐的
您应该只分配所需的内存,然后让malloc整理剩余的内存。C标准说
如果分配成功,则返回的指针将适当对齐,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针,然后用于访问所分配空间中的此类对象或此类对象数组(直到显式释放空间)
因此指针对齐不是16字节,而是实现定义的;在您的实现中,有一些类型的对象需要在内存中对齐16字节;因此,malloc返回的指针是16字节对齐的
然而,这并不意味着char*p=malloc(1)
为16个字节分配内存-相反,您不能接触p[0]
之外的任何内存malloc
还需要一些内部簿记,因此malloc(1)
总共消耗16字节的内存,而malloc(16)
将消耗32或64字节的内存;你可能不知道。C标准说
如果分配成功,则返回的指针将适当对齐,以便可以将其分配给指向具有基本对齐要求的任何类型对象的指针,然后用于访问所分配空间中的此类对象或此类对象数组(直到显式释放空间)
因此指针对齐不是16字节,而是实现定义的;在您的实现中,有一些类型的对象需要在内存中对齐16字节;因此,malloc返回的指针是16字节对齐的
然而,这并不意味着
char*p=malloc(1)
为16个字节分配内存-相反,您不能接触p[0]
之外的任何内存malloc
还需要一些内部簿记,因此malloc(1)
总共消耗16字节的内存,而malloc(16)
将消耗32或64字节的内存;你可能不知道。我有时会看到马洛克(1)。我每次看到它都会畏缩。这就像用一辆40吨重的卡车上下班。这取决于实际的实施情况。谢谢。我想更好地理解malloc
,不是因为我需要调用malloc(1)
。malloc(1)是错误的。即使架构在16字节边界上对齐块,也不能保证您可以合法地处理以下15个字节。例如,void*ptr=malloc(1);memset(ptr,0,16);可能是,也可能不是。在任何情况下,这个假设都是不可移植的。你为什么认为你只需要malloc()
你所需要的大小。我有时会看到malloc(1)。我每次看到它都会畏缩。这就像用一辆40吨重的卡车上下班。这取决于实际的实施情况。谢谢。我想更好地理解malloc
,不是因为我需要调用malloc(1)
。malloc(1)是错误的。即使架构在16字节边界上对齐块,也不能保证您可以合法地处理以下15个字节。例如,void*ptr=malloc(1);memset(ptr,0,16);可能是,也可能不是。在任何情况下,这个假设都是不可移植的。为什么你认为只需malloc()
你所需要的大小。谢谢,但是如果它永远不会将其他15个字节重新分配给其他任何人以保持16字节的边界,那么这不是和总是在16字节块中工作具有相同的效果吗?谢谢,但是,如果它永远不会将其他15个字节重新分配给其他任何人,以保持16字节的边界,那么这不具有与始终在16字节块中工作相同的效果吗?