Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
malloc边界大小:是否存在性能差异_C_Malloc - Fatal编程技术网

malloc边界大小:是否存在性能差异

malloc边界大小:是否存在性能差异,c,malloc,C,Malloc,我在C上的初学者课程中有这样一个注释:在x86机器上,malloc返回指向与16字节边界对齐的块的指针 这是否意味着调用malloc(1)没有任何优势,即性能与调用malloc(16)没有区别?每次调用malloc都不需要向操作系统请求内存。它会询问操作系统何时需要内存上的大卡盘,然后分配一点给您。在未来的呼叫中,它将有那个位空闲,并且可以将它分配给您,而无需询问操作系统 因此,它将分配方便处理器使用的内存—通常是对齐的 您应该只分配所需的内存,然后让malloc整理剩余的内存。对malloc的

我在C上的初学者课程中有这样一个注释:在x86机器上,
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字节块中工作相同的效果吗?