为什么需要在c/c++;? 直截了当:在C++中需要分配内存的原因是什么?
我知道有些编程语言是自动完成的,但在C/C++中:需要分配内存的原因是什么。例如:为什么需要在c/c++;? 直截了当:在C++中需要分配内存的原因是什么?,c++,c,memory,memory-management,C++,C,Memory,Memory Management,我知道有些编程语言是自动完成的,但在C/C++中:需要分配内存的原因是什么。例如: 声明PROCESSENTRY32时,为什么需要将其归零?为套接字程序创建缓冲区时,为什么需要将其归零?为什么在声明int数据类型时不需要分配内存 你的问题没有真正意义零内存不分配内存;它只是将字节设置为0。如果需要,您可以轻松地ZeroMemoryanint。只是i=0写起来比较短 在所有情况下,ZeroMemory只对已经存在的内存起作用;i、 e.以前一定有别的东西分配了它 对于实际分配,C区分了对象的三种存
声明PROCESSENTRY32时,为什么需要将其归零?为套接字程序创建缓冲区时,为什么需要将其归零?为什么在声明int数据类型时不需要分配内存 你的问题没有真正意义<代码>零内存不分配内存;它只是将字节设置为
0
。如果需要,您可以轻松地ZeroMemory
anint
。只是i=0代码>写起来比较短
在所有情况下,ZeroMemory
只对已经存在的内存起作用;i、 e.以前一定有别的东西分配了它
对于实际分配,C区分了对象的三种存储:
静态存储。这些对象是在程序启动时分配的,并在程序运行时一直有效。示例:全局变量
自动存储。这些对象在执行到达其作用域时分配,在执行离开其包含作用域时解除分配。示例:局部变量
动态存储。这是您通过调用malloc
/calloc
/realloc
/free
手动管理的内容
唯一需要自己分配内存的情况是第三种情况。如果你的程序只使用自动存储,你不需要做任何特殊的事情
在Java这样的语言中,您仍然需要通过调用new
来分配内存。Python没有new
,但例如,每当您执行[…]
或{…}
之类的操作时,它都会创建一个新的列表/字典,用于分配内存。
关键的一点是你不必释放内存
像Java或Python这样的语言包括一个垃圾收集器:您创建对象,但该语言负责清理您身后的垃圾。当对象不再需要1时,它将自动解除分配
C不会那样做。原因在于它的历史:C是作为汇编代码的替代品被发明的,目的是使将Unix移植到新的计算机上更容易。自动垃圾收集需要一个运行时系统,这增加了复杂性,并且可能会有性能问题(即使是现代垃圾收集器有时也会暂停整个程序以回收内存,这是不可取的,而C是1972年创建的)
没有垃圾收集器会导致C
- 易于实现
- 更容易预测
- 可能更有效
- 能够在非常有限的硬件上运行
C++本应是一个“更好的C”,面向同样类型的受众。这就是为什么C++几乎保留了C的所有特性,即使是那些对自动垃圾收集非常不友好的原因。
1不完全正确。当不再可访问时,将回收内存。如果程序仍然能够以某种方式到达某个对象,那么即使不再需要它,它也将保持活动状态(另请参见:)。C选择相对低级的语言,其中语言构造或多或少直接映射到最多几个机器指令
块级分配,例如
int main()
{
int a,b,c; //a very cheap allocation on the stack
//... do something with a, b, and c
}
属于这一类,因为函数中的所有块级分配通常只转换为对堆栈指针的一次减法
这些分配的缺点是它们非常有限--您不应该像这样分配大对象或多个对象(或者您可能会遇到堆栈溢出的风险),而且它们也不是非常持久--它们在作用域的末尾被有效地撤消
至于来自主内存的通用分配,除了大量的字符(即RAM)和可能的虚拟内存映射功能(即将真实内存映射到较小的字符数组)之外,机器实际上并没有为您提供太多。有多种方法可以分割这些数组,并使用和重用这些片段,因此C将其留给库。C++在C. 分配内存超出了它分配的范围之后。4)动态分配内存的主要原因是,这样你就可以控制对象的生命周期。如果让语言来做,对象的生命周期是预定义的(而且定义非常严格),但是通过使用“动态”分配,您可以显式地控制其生命周期何时结束以及何时销毁(以及调用析构函数时对象的生命周期)。Python和Java在为您处理内存时所做的操作被调用我认为,C++设计的运行速度尽可能快,引导了很多设计选择。我怀疑Stroustrup(C++创建者)不想花费计算能力来跟踪内存,当你想多快(慢?)时,你能理解它吗?CPU出现在20世纪70年代末/80年代初。我已经编写了大量没有malloc
的被占用/裸机固件。动态分配超出了它的范围。因此,您可以将内存返回给调用者,调用者可以随心所欲地使用内存。如果没有内存分配,调用者需要提前知道需要多少字符用户输入到你的程序。试着告诉用户。比如“如果你输入超过8个字符,软件就会崩溃”。首先想想他们会这样做-输入9,看看会发生什么。Python和Java使用的方式,更动态的分配方式只有一个被解释,另一个有垃圾collector@JohnPhode:请不要使用malloc()C++程序中的代码/代码>这是一种简单的语言(C)的C++。C++有完全不同的内存处理技术,C.也使用现代C++,使用辅助对象(智能指针)来执行细粒度的确定。