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

标签 c memory malloc calloc

我目前正在用 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/

相关文章:

c++ - 为什么 boost 可选引用不是 T* 的包装器?

c - C 段错误中的文件 I/O

c - 检索物理屏幕尺寸

c - ICU 和 UTF-8 字符串的基本操作

c++ - 如何为特定数量的字符串分配内存?

c++ - 在 Visual Studio 中模拟一个简单的内存泄漏,结果有点困惑

c++ - 何时使用 Malloc 而不是 New

c - 删除c中链表中最后一项的问题

c - 在 C 中,确保多段代码的汇编指令数是固定的

c - fgets函数C