为啥内存管理很重要? [关闭]

Posted

技术标签:

【中文标题】为啥内存管理很重要? [关闭]【英文标题】:Why is memory management important? [closed]为什么内存管理很重要? [关闭] 【发布时间】:2014-04-14 19:51:30 【问题描述】:

我知道这是一个非常愚蠢的问题,但我觉得我一直在错误地学习 C++,太多地忽略了内存。我总是听说 C++ 和 C 中的内存管理,但它对视频游戏或某些办公程序之类的东西有什么重要性?

【问题讨论】:

因为它不是无限的,如果你不管理它,你就会浪费它。 这就像资金管理——对大多数人来说是有限的资源而不是无限的 好吧,如果你使用太多,最终你的应用程序将崩溃或终止。例如,使用 GDI 创建图像或使用 GDI 截屏,如果你忘记释放 DC 和使用该函数的次数足够多,它会抛出EOUTOFRESOURCE 错误。当我忘记调用ReleaseDC(NULL, DC) 时,我遇到了这个问题。它是有限的。 内存管理有几个方面,有些方面可能比其他方面更重要。对我来说,最重要的是确保没有内存泄漏。其次可能是尝试对称地分配和释放各种内存分配。您是否对某个特定方面感兴趣? 不,我只是好奇。我尝试阅读的所有教程和书籍都只是谈论内存管理是如何进行的,而没有说明原因。这样做真的会破坏指针、引用、虚函数等事物的重要性。这些反应已经澄清了很多。 【参考方案1】:

C 和 C++ 是大多数人认为低级(或具有低级部分)的语言,这允许您编写特定于硬件的代码。而且由于硬件通常对其输入有很多先决条件,因此您必须手动管理内存,包括内存布局、分配、填充等。

这是与硬件交互时可以预料到的,实际上是处理硬件所必需的。但是,在实现非硬件特定代码时,仍然适用相同的实用程序和语言功能。 IE。如果你想要一块动态内存,你必须明确地请求它,并明确地释放它(困难的部分)。在 C++ 中,解决这个问题的方法是使用类来帮助您处理内存管理,方法是将内存管理全部抽象出来,或者提供垃圾收集(通常通过引用计数)。

不清理垃圾的后果,即将资源返回给系统,也称为泄漏,是指系统最终会耗尽资源(因为资源通常是有限的,尽管有时是巨大的)。如果您的程序很小,并且执行时间有限,这可能不是问题,但是您应该处理您的资源,因为托管环境实际上不需要这样做,对您来说,在程序终止后(尽管大多数系统会这样做,至少在内存方面)。

另外请注意,您应该专注于管理资源。而不仅仅是记忆。有很多资源,都是有限的,因此都需要管理。其他资源可能是;文件、IP 套接字、句柄、硬件设备……

对于特定的游戏,您必须期望高资源使用率,在内存和文件访问方面,您的游戏可能会运行很长一段时间(假设它很好),因此处理资源管理变得至关重要!

我最好的建议是远离原始指针和手动内存管理(新/免费),而是使用标准容器(std::vector,类似),值语义(即通过值而不是传递参数通过指针。),引用语义,如果你真的必须使用指针,请使用 std::unique_ptr 和 std::shared_ptr。 (这是假设您编写非硬件代码,如游戏或文本处理器)。

Sean Paul 在 2013 年即将举行的本地会议上做了一个关于避免指点的演讲,真的很值得一看。我不记得演讲的名字了,但它在 channel9 网页上免费直播。 go native 的其他演讲也值得推荐!

【讨论】:

【参考方案2】:

您可能已经知道答案,但考虑到您的计算机只有有限数量的内存,应用程序必须以保守的方式管理此内存是很自然的。 例如,如果一个游戏对内存的管理不善,并且占用了您已安装的 8 GB 内存中的很大一部分,那么其他需要少量内存的应用程序基本上会开始争夺它。这通常会导致您的操作系统开始与其他存储介质交换内存,并最终降低计算机的性能,直到有更多内存可用。

【讨论】:

以上是关于为啥内存管理很重要? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 PHP 的垃圾收集器会降低性能,没有它如何管理内存?

Python深入学习之内存管理

Java内存管理及垃圾回收总结

Python深入06 Python的内存管理

Python深入06 Python的内存管理

系统为啥这么慢