gpt4 book ai didi

c++ - 为什么在c/c++中需要分配内存?

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

开门见山:c++需要分配内存的原因是什么?

我知道一些编程语言会自动执行此操作,但在 C/C++ 中:必须分配内存的原因是什么。例如:在声明PROCESSENTRY32时,为什么需要ZeroMemory()呢?在为套接字程序制作缓冲区时,为什么我们需要 ZeroMemory() 呢?为什么在声明int数据类型时不需要分配内存?

最佳答案

你的问题没有意义。 ZeroMemory 不分配内存;它只是将字节设置为 0。如果需要,您可以轻松地使用 ZeroMemoryint。只是 i = 0; 写起来更短。

在所有情况下,ZeroMemory 仅适用于已存在的内存;即之前必须有其他东西分配它。

对于实际的分配,C区分了三种对象的存储方式:

  1. 静态存储。这些对象在程序启动时分配,并在程序运行时一直存在。示例:全局变量。

  2. 自动存储。这些对象在执行到达其作用域时分配,在执行离开其包含作用域时释放。示例:局部变量。

  3. 动态存储。这是您通过调用 malloc/calloc/realloc/free 手动管理的内容。

    <

您真正必须自己分配内存的唯一情况是情况 #3。如果您的程序仅使用自动存储,则无需执行任何特殊操作。

在像 Java 这样的语言中,您仍然必须通过调用 new 来分配内存。 Python 没有 new,但是例如每当您执行 [...]{...} 之类的操作时,它都会创建一个新的列表/字典,用于分配内存。关键部分确实是您不必释放内存。

Java 或 Python 等语言包含垃圾收集器:您创建对象,但语言负责在您身后进行清理。当不再需要某个对象时1,它会自动释放。

C 不会那样做。原因在于它的历史:C 是作为汇编代码的替代品而发明的,目的是使将 Unix 移植到新计算机更容易。自动垃圾收集需要一个运行时系统,这增加了复杂性并且可能存在性能问题(即使是现代垃圾收集器有时也会暂停整个程序以回收内存,这是不可取的,而 C 早在 1972 年就已创建)。

没有垃圾收集器使得 C

  • 更容易实现
  • 更容易预测
  • 可能更有效率
  • 能够在非常有限的硬件上运行

C++ 旨在成为“更好的 C”,针对的是同类受众。这就是为什么 C++ 保留了几乎所有 C 的特性,甚至是那些对自动垃圾收集非常不友好的特性。


1 不完全正确。当内存不再可用时,内存将被回收。如果程序仍然可以以某种方式访问​​某个对象,即使不再真正需要它,它也会保持事件状态(另请参见:Space leak)。

关于c++ - 为什么在c/c++中需要分配内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53345374/

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