gpt4 book ai didi

c - malloc 对 calloc 的安全/性能影响?

转载 作者:太空宇宙 更新时间:2023-11-04 02:47:52 26 4
gpt4 key购买 nike

根据Linux手册页,callocmalloc的区别是malloc不初始化内存,而 calloc 确实 初始化内存。

这在实践中意味着如果我创建一个这样的结构:

struct Danger {
char a;
char b;
char c;
char d;
}

如果我使用 malloc 创建它:

struct Danger *dang = malloc(sizeof(struct Danger));

此时 dang->a 似乎真的可以是任何值,因为内存未初始化。如果我使用 calloc:

struct Danger *dang = calloc(1, sizeof(struct Danger));

我现在知道dang->a必须等于\0

malloc 可能存在的原因可能是您将写入您立即分配的整个内存空间,您一开始并不真正关心那里有什么。这为您节省了将无论如何都会被覆盖的数据清零的额外步骤

不过,从程序安全性和稳定性的角度来看,使用 malloc 似乎应该是异常(exception)而不是规则,因为它很容易导致未定义的行为。

两个问题:

  • 在野外的 C 程序是否经常处理由于 malloc 而导致的意外功能?这是一个相当反复出现的问题吗?
  • 如果我每次都只使用 calloc 而不是 malloc,我会得到多少性能损失?

最佳答案

Do C programs in the wild deal with unexpected functionality as a result of malloc often? Is this a fairly recurrent problem?

他们经常处理“问题”,但通常是以尽量不读取垃圾数据的方式。这通常没有问题,因为数据无论如何都需要初始化。真正的危险在于无意中读取垃圾/零数据,使用calloc() 不能排除这种情况。

有一些方法可以确保程序不会读取垃圾数据。最简单的方法是使用 valgrind 执行测试套件。它报告任何垃圾数据的读取。它还会捕获任何释放后使用错误、未分配内存的访问、丢失的内存块等。

How much of a performance penalty do I really get if I just use calloc every time instead of malloc?

恰恰是写两次数据的开销。它可能会从缓存中删除一些有值(value)的数据,因此这实际上取决于内存块的大小,以及您之后使用合理数据填充它的操作顺序。

  • 最坏的情况:清零会从缓存中逐出您需要填充内存块的数据。这些数据需要从内存中重新加载,这是影响性能的主要部分。对于几兆字节数量级的内存块,这可能会产生大约 100 微秒的影响。详细信息取决于您的机器。

  • 最佳情况:您在分配一个小内存块后立即填充它,而不读取任何数据。在这种情况下,开销只是将数据写入一级缓存的开销。尽管这是一个快速操作,但您仍然可以预期清零与您自己的初始化花费相同的时间 - 缓存不会无限快。


就个人而言,当我需要一个零初始化 block 时,我只使用calloc() 作为获取零初始化 block 的便捷方法。通常情况并非如此。但它时常发生。

关于c - malloc 对 calloc 的安全/性能影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25454358/

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