vector内存占用的问题!

ainol 2003-02-28 08:57:53
我在一个程序中用vector<string>作容器存储一个约1M的文件,结果运行这个程序时占用了数倍的内存空间!如果存放在容器内的文件增加,程序占用的内存空间也成倍的增加,请问这是STL的弊端吗?能否改进?
...全文
383 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
ainol 2003-03-03
  • 打赏
  • 举报
回复
惭愧,两天没学习了!
非常感谢Solstice(大佛) 提供的有价值性资料!
通过学习,我对vector<string>有了很深刻的认识,它并不能像数组那样可以约内存(即使有.reserve() )!
本帖到此结束,非常感谢诸位给予的宝贵指点!
Robin 2003-03-01
  • 打赏
  • 举报
回复
呵呵!
陈硕 2003-03-01
  • 打赏
  • 举报
回复
建议楼主参考一下 荣耀 的 《C++设计日志:读写定界符文件》
其中就用到了vector<string>来储存文件的内容,手法很好。

http://www.royaloo.com/articles/articles_2003/PracticeofCD_Delimfile%20.htm

http://www.royaloo.com/code/code.htm

http://www.royaloo.com/articles/articles_2003/Delimfile_FAQ.htm

另外,我没有看懂楼主到底想做什么。
sunriselx 2003-02-28
  • 打赏
  • 举报
回复
typedef struct{
char[n] data; //n是你现在每个string中字符的长度
}filedata;

vector<filedata>,这样就是二维数组了。
J2eeLearner 2003-02-28
  • 打赏
  • 举报
回复
string 也有reserve() 成员函数!
ainol 2003-02-28
  • 打赏
  • 举报
回复
To Tommy() :
我的确用vector<string>,可是我要用到二维性的,可vector<char>可能达不到!
我是用fgets(buf,...)一定的字符,然后再 push_back()进去。。。
Tommy 2003-02-28
  • 打赏
  • 举报
回复
to ainol (艾诺) :

你不会是用vector<string>,每项存放一个字符吧?那样的话内存浪费可就太多了,应该用vector<char>
Tommy 2003-02-28
  • 打赏
  • 举报
回复
同意sunriselx()

vector浪费的内存估计不会太多,反而是string中用得多。
不知道你是怎么将内容存入vector中的?如果先将string准备好,再push_back的话,vector中的string应该只占用必要的内存吧
ainol 2003-02-28
  • 打赏
  • 举报
回复
纠正:
To J2eeLearner(jinfeng_Wang):
<< 我用vector::capacity()得到容器内的数据大小的确与文件的大小差不多!
得到的数据是原文件大小的两倍。。。
///

To sunriselx():
vector<vector<char>> 实在看不懂,请问能否指教一下,或是给些源代码。。。
顺便问一上,vector<vector<char>>会不会使性能下降很多..?

sunriselx 2003-02-28
  • 打赏
  • 举报
回复
其实你的内存膨胀主要是由string造成的,string也是一个容器,对他的添加操作也会造成内存膨胀。我想你的二维数组可以用vecotr<vector<char>>实现,这样可以控制内存,注意决不要insert,想办法用resize()替代。
ainol 2003-02-28
  • 打赏
  • 举报
回复
To sunriselx() :
其实vector<string>就是一个类似二维数组的东西;
而vector<char>可能没有这种特性,它是一维数组[存放的都是一些连续的字符,不利于取出某一指定的字符串]!(不知对否)
并且,fread()是连续地在一个文件中读入数据,我不是我需要的!
我想按照字符串为组的单位进行存储起来,而且是只将每一行中的前n个Byte保存到容器内!
///
To J2eeLearner(jinfeng_Wang):
我用vector::capacity()得到容器内的数据大小的确与文件的大小差不多!我估计不是容器内存储数据占用内存造成的,可能是其它原因(例如容器自身的原因)。
我是在程序运行起来以后,按下Button,然后用一个专门的内存使用状况监测工具进行监测而出的结果!!
sunriselx 2003-02-28
  • 打赏
  • 举报
回复
to ainol (艾诺) :
你没明白我的意思,无论是vector<string>还是vecotr<char*>,你在向量中存放的是指针,这时候resize(n)时,只分配n*4内存,我的建议是vector<char>,你可以这样用:
vector<char> filedata;
int filesize = 1024*1024;
filedata.resize(filesize);
read(fd, &filedata[0], filesize);
这样文件内容就放进向量中了。
fangrk 2003-02-28
  • 打赏
  • 举报
回复
想想是否可以改变一下算法。
把一个1M大的文件全部放到vector是不是有些夸张啊?
J2eeLearner 2003-02-28
  • 打赏
  • 举报
回复
另外,能否告诉我,你是如何 知道vector实际占用的内存的?
J2eeLearner 2003-02-28
  • 打赏
  • 举报
回复
你可以事先估计好你所需要的内存长度,然后分别reserve
这里的分别是指vector::capacity(),string::capacity() 都可以reserve
ainol 2003-02-28
  • 打赏
  • 举报
回复
刚才试了,在vector<string> 中使用resize( m )好象不起作用!m已经足够大的!
///////////
并且使用reserve( 2k ),而vector分配的只有1K,结果占用的内存是 5k甚至更多,根本没起到作用!
caizzrr 2003-02-28
  • 打赏
  • 举报
回复
你这个问题是vector会自动增长造成的,因为string的对象太大了,很快就达到vector的容量,这样vector的容量就会自动增加一倍,

为什么不用vector <string *>,一个指针才32bit,足够vector的容量,不过vc的vector的容量
和c++标准的小得多,这里要注意
termite 2003-02-28
  • 打赏
  • 举报
回复
确实耐人寻味
LearnAtl 2003-02-28
  • 打赏
  • 举报
回复
是这样的,假如你的vector域分配了10000的大小,当你在Vector里面写入10001个大小的时候,vector会分配你的2倍的大小的容量,既20000大小。
vector当容量不够的时候,是成倍的增加,分配内存的。为了节省内存,你应该使用resize类从新分配。
ainol 2003-02-28
  • 打赏
  • 举报
回复
Thanks!
应该是vector<char*>吧,vector<char>是字符型的吗?
我在书上看到vector<string>也可以预分配,好象用reserve(),,,结果试验不但不起作用,反而占用的内存空间更大了!
加载更多回复(10)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧