gpt4 book ai didi

c - free 中是否有检查空指针的额外开销?

转载 作者:行者123 更新时间:2023-11-30 18:30:12 24 4
gpt4 key购买 nike

我并不是在问在调用free之前是否需要检查指针是否为NULL,我知道我不需要。相反,我要问的是,free 的(典型)实现是否会在释放之前牺牲时间来检查 NULL 指针,或者进程的本质是否实际上不会调用任何指针。额外的开销。例如,知道 free 做什么的人可能会想象它的实现可能是这样的:

void free(void* ptr){
if(ptr != NULL){
<proceed with deallocation>
}
}

但这与不为我不使用的东西付费的 C 哲学相矛盾:如果我知道我不会将 NULL 指针传递给 free,那么就不应该有从而导致绩效缺陷。因此,我非常确定free通常不会会产生这样的成本,在这种情况下,我想知道如何/为什么。我尝试寻找这个问题的答案,但我看到了一大堆问题,询问删除 NULL 指针是否安全。

编辑:我已经对答案和评论感到满意,但为了将来的引用,我想弄清楚我在问什么。我不是从程序员的角度询问在调用free之后程序和我的NULL指针的状态。我对堆管理器的角度更感兴趣。举个例子来说明我的意思,假设我在一家面包店,我的工作就是把 table 上的所有东西都扔进垃圾桶。它可以是 5 个布朗尼蛋糕、一打 cookies 或其他任何东西,是的,我知道这不是最好的类比,但请耐心听我说。我想知道是否存在堆管理器,例如,如果 table 上没有“任何东西”,我将“什么东西”倾倒到垃圾箱中是否会产生任何影响,这将是一个隐式处理“无”。对“无”的显式处理是我在尝试转储表之前检查表以查看其上是否有任何内容。我想知道堆管理器通常是否可以隐式处理这种情况,即通过执行与通常相同的操作并顺便处理 NULL 指针,或者显式地通过显式检查查看指针是否为NULL。正如 awksp 的评论所揭示的那样,由于要求在 NULL 指针的情况下不执行任何操作,因此必须确实存在显式检查,因为处理 NULL 指针与其他操作相同不会是空操作,因此我们必须事先显式检查 NULL

最佳答案

这就是为什么在 free() 中检查 NULL 不仅仅是一个好主意:

当您使用malloc()时,您不必记住您请求了多少内存:堆管理器会为您做这件事。因此,当您释放一个 block 时,必须将释放的 block (正确大小)添加到它用来保存此信息的任何数据结构中。

那么,它怎么知道尺寸呢?它可以在包含所有已分配内存列表的其他结构中找到指针,但没有某种 Content-addressable-memory硬件,这可能会很慢。因此,大多数堆管理器使用一种技巧来存储有关您在内存中分配的 block 的元数据,紧接着它们给您的指针之前。 (不可能是在 block 的末尾,因为记住我们不知道实际的 block 大小...)

如果堆管理器没有显式检查 NULL,它将开始尝试访问负地址(例如 NULL-16)的内存,这可能会导致访问冲突和各种其他不良影响。在开始之前有一个简单的 (if x=NULL) 会更好。

这会影响性能吗?有可能,但与典型堆管理器中所需的所有 block 合并、列表搜索等相比,这完全是微不足道的。

关于c - free 中是否有检查空指针的额外开销?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32429502/

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