关于为什么要进行人工的动态分配内存

本文探讨了在处理不确定大小的数据时,如何选择使用堆或栈,通过比较两者的特点和适用场景,提供了灵活的数据处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

举个简单的例子,你是要把你这辈子要吃的盐巴全部买下来,还是说你的盐巴什么时候不够了再去买?
你能确定你这辈子吃多少盐巴吗?

当然你可以估计出来,也可能估计的差不多,但是你肯定不会这么做,合理的方法是,随用随买,我是这么理解的


有些时候,你根本不清楚你即将处理的数据有多大,你用来缓存的内存够用吗。

举个例子,C风格的字符串跟STL的 string,那个好用,不用多说。
为何好用,就是你用前者,如果不自己动态分配内存,就要写死一个MAX,这个MAX过大,浪费内存,太小,很有可能在某次处理的时候不够用。

栈才有2兆大小,不动态,如果超过两兆,就不灵了


如果已知要用的空间不大且大小是预知的范围内,直接用栈就好了。用堆可以申请4G的内存空间,一般的栈也就2M,而且一不小心就会面对栈溢出的问题。

假设需要完成这样一个任务:
从某个文件中读取若干个整数,将它们排序, 输出到另一个文件。


我们不知道“若干个”到底是多少个, 可能是几个, 也可能是几万个,几百万个,几千万个……
楼主打算怎么做呢?

首要要弄清楚 堆和栈的区别:
栈是线程相关的  一个线程会建立一个栈,函数中的局部变量 实际上是在栈里面的  函数返回后 就从栈中pop出来,栈的容量是有限的  超过一定大小就栈就会击穿了,比如你写了深层次的递归,然后再函数中使用大量的数组,很容易就击穿了
堆是动态存储空间,一个进程默认只有一个堆,进程中所有的线程都共享这个堆的空间,所以你在一个线程中从堆中分配内存,再另一个线程中也可以访问,同时堆也更容易扩展和交换数据

对于要处理的数据我们常常会不知道到底有多大,所以采用动态开辟的方法,这样才可以更加合理的对数据进行处理

数组和动态分配是两个相对的东西,在处理数据变化较小时,可以设定一个数组上限,前提是待处理的数据不能超过这个上限,这个时候用数组是较好的.但如果数量变化较大而又无法确定数据上限到底有多大时,这个时候最好是用动态分配,不然的话,就像前面人提到如果使用一个数组的话,太小了可能会溢出,太大了又有可能会浪费.
如果用到递归,最好尽量避免用局部数组,如果一定要用数组的话,那最好改为static类型的数组

在一些简单的小程序里,动态分配看不出优势来,但是在一些大程序里,有很多的不确定的变量,如果不用动态分配的话,工作量是很大,还造成资源浪废,要知道在电脑里资源是很缺的

对一个对象的操作,特别是大小未知的时候,常用动态分配。

虽然是由于对象大小的不确定性 貌似导致动态分配很有必要,但我认为最主要原因应该是栈太小的限制。
特别是对于进程本身不大,但是可能操作很大的数据时,就可以使用动态分配内存处理数据,二栈就安排很小但够用就可以 了。

### 常见的开发大型AI模型编程语言 Python 是最广泛使用的编程语言之一,在构建大规模的人工智能和机器学习项目中占据主导地位[^1]。其丰富的库支持,如TensorFlow、PyTorch等框架极大地简化了神经网络的设计与实现过程。 #### Java 尽管 Python 占据主流位置,Java 也逐渐成为一种可行的选择。特别是随着 TensorFlow.js 的发布,使得 JavaScript 开发人员可以在浏览器环境中轻松地训练并执行机器学习算法[^3]。不过需要注意的是,这里的重点在于前端Web环境中的应用而非传统意义上的服务器端或独立应用程序开发。 #### C++ 和其他高性能选项 对于追求极致性能的应用场景来说,C++ 提供了一个更底层的操作接口,可以更好地控制硬件资源分配,从而优化计算效率。然而,相较于高级脚本语言而言,采用这类低级别的工具通常意味着更高的复杂度和技术门槛。 ```cpp // 示例:使用C++编写简单的矩阵乘法操作(适用于某些特定加速) #include <Eigen/Dense> using namespace Eigen; MatrixXd matA(2, 2); matA << 1, 2, 3, 4; MatrixXd result = matA * matA.transpose(); std::cout << "Result:\n" << result << std::endl; ``` 除了上述提到的语言之外,还有 Julia 这样专门为科学计算设计的新星正在崛起;Rust 则凭借内存安全特性吸引了部分开发者关注。每种语言都有各自的优势所在,具体选择取决于项目的实际需求和个人偏好等因素综合考量的结果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值