gpt4 book ai didi

调用(): Do the individual values matter for performance?

转载 作者:太空狗 更新时间:2023-10-29 15:04:32 26 4
gpt4 key购买 nike

我目前正在用 C 语言编写嵌入式应用程序,其中性能至关重要。

目前,我正在分配大量空内存,如下所示:calloc(1, num_bytes) - 然而,我只是将 num_bytes 计算为多个项目和代码前面每个项目的大小,因为它是用于调用 malloc 的代码。

calloc 似乎很独特,因为它是 -alloc 系列中唯一的内存分配函数,它采用两个参数来确定大小。这样做有充分的理由吗?指定不同的参数是否会对性能产生影响?选择这种参数布局的理由是什么?

最佳答案

具有单独参数的一个优点是它可以自动防止整数溢出:

// On a 32-bit system, the calloc will almost certainly fail, but the malloc
// will succeed to overflow, likely leading to crashes and/or security holes
// (e.g. if the number of items to allocate came from an untrusted source)
void *a = calloc(64, 67108865); // 2^32/64 + 1
void *b = malloc(64 * 67108865); // will allocate 64 bytes on 32-bit systems

对于大型分配,执行 calloc 而不是 mallocmemset 组合也可能具有性能优势,因为 calloc 实现可以使用其堆的内部知识来避免不必要的工作或提高缓存性能。

例如,如果分配器决定使用操作系统函数,例如 mmap(2)VirtualAlloc为了获得更多的虚拟地址空间,出于安全原因,该内存将被预先置零。参见 this question详细解释。对于小额分配,您不太可能注意到很大的差异。

一些 calloc 实现只是在内部调用 mallocmemset,所以除了潜在的溢出检查之外没有任何优势。

关于调用(): Do the individual values matter for performance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12149300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com