[讨论]C/C++编程中 未知大小数据存储的内存分配方案
使用C/C++编程时,常需要开辟一块连续的内存空间来存储或记录某些数据,但在扫描数据之前不知道该数据的大小。
例如,需要遍历一个数据表,筛选出符合某条件的记录,并存储在内存中。
显然,我们不能立即分配完全符合数据大小的内存空间而不导致指针越界,以下是我总结的几种常用方法:
1. 事先估计一个长度(数据绝对不会超过这个长度),分配定长的内存空间;
2. 将源数据扫描两遍:第一遍仅计算长度(然后分配存储空间),第二遍提取数据;
3. 使用链表,一边扫描源数据,一边动态申请内存,同时统计数量,再分配使用指针数组来实现逻辑上的“连续”;
4. 使用可回读的数据流(例如磁盘文件)来临时存储这些数据,分配空间,再将这些数据全部读到内存中;
5. 内存地址映射。
评判上述几种方案:
方案一,在数据较少或大小稳定的情况下方便、快捷,但对于大量且数量波动很大的情况极易造成指针越界,或带来严重的空间浪费;
方案二,对于少量数据来说实现方法简单,但“浪费”了一次扫描;
方案三,实际上不连续,但使用指针数组构成了逻辑上的“连续”,缺点是编程时需重新构造原先数据结构以形成链表(至少增加next字段),同时由于增加next指针也造成了一定空间浪费,由于存储空间分立,不易于内存清理;
方案四,一次遍历即可获取全部信息,由于数据流的特性而不必担心越界,但需要进行写、读两次文件操作,会因速度慢而造成瓶颈效应;
方案五,实现方法过于复杂。
以上仅仅是我个人总结的,希望大家踊跃讨论,提出各自的方法!