为什么我总是听到在 C 语言中可以避免分配内存?

Why do I always hear to avoid allocating memory when I can in C?

提问人:BobDeTunis 提问时间:2/5/2023 最后编辑:BobDeTunis 更新时间:2/5/2023 访问量:126

问:

我总是被告知,只要没有内存,我就可以实现完全相同的事情,就不要分配内存。
人们之所以这么说,是因为释放代码中的内容可能需要一些时间,还是有一个面向效率的解释?(例如,更好的性能)

C 内存管理 malloc

评论

0赞 guard3 2/5/2023
忽略分配会引入跟踪指针并负责释放的细微差别这一事实,分配是一项代价高昂的操作。如果您知道某些东西需要多少内存,请避免分配(除非您需要一些非常大的内存来填满您的堆栈)。
1赞 B Remmelzwaal 2/5/2023
为什么堆上的内存分配比堆栈上的内存分配慢得多?
0赞 Steve Summit 2/5/2023
在 C 语言中,使用分配内存就像在限制通行的高速公路上快速行驶一样。除非你必须这样做,否则你不会这样做,但如果你必须这样做,这是唯一的出路。malloc
0赞 Chris Dodd 2/5/2023
做某事总是比不做某事更昂贵。一般来说,你应该避免做任何不必要的事情。

答:

3赞 Harith 2/5/2023 #1

因为管理内存很复杂,而且容易出现各种错误。太容易忘记某件事,或者忘记两次,或者在使用后使用某事。从堆中分配内存的成本也更高,并且有一些相当大的开销。free()free()free()

我总是被告知,只要我能实现 没有它完全一样的事情。

这是一个很好的建议。当您可以没有动态内存分配时,请放弃它。仅当分配的大小在编译时未知时(例如用户输入),才应从堆中分配内存。但即便如此,您也应该指定一个上限。

Смотритетакже: 为什么堆上的内存分配比堆栈上的内存分配慢得多? 和 Malloc 或普通数组定义? 和何时需要动态内存?

5赞 Steve Summit 2/5/2023 #2

作为公认的答案的对立面:

虽然避免在不需要的时候使用确实是很好的建议,但重要的是要知道如何在需要它时正确使用它——因为很多时候你确实需要它!事实上,我甚至可以说,几乎任何对数据做一些有趣的事情的程序,都会希望为这些数据动态分配内存。malloc

例如,如果你正在编写一个文本编辑器,你不会希望将你的用户限制在编写文本编辑器时静态分配的某个固定的最大文本行数——你将希望为用户在任何给定日期编辑的文本行数分配数据结构。也许只是少数,也许是一个巨大的数字。

确实,如果使用不当,会出现许多错误。但也有很多编码模式可以安全方便地使用。这些模式值得学习和使用!mallocmalloc