社区
工具平台和程序库
帖子详情
vector
内存占用的问题!
ainol
2003-02-28 08:57:53
我在一个程序中用vector<string>作容器存储一个约1M的文件,结果运行这个程序时占用了数倍的内存空间!如果存放在容器内的文件增加,程序占用的内存空间也成倍的增加,请问这是STL的弊端吗?能否改进?
...全文
383
30
打赏
收藏
vector<string>内存占用的问题!
我在一个程序中用vector作容器存储一个约1M的文件,结果运行这个程序时占用了数倍的内存空间!如果存放在容器内的文件增加,程序占用的内存空间也成倍的增加,请问这是STL的弊端吗?能否改进?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
C++
string
与
vector
<float>类型相互转换之
string
stream(十九)
1.
string
stream类型转换用法 stream
string
在调用str()时,会返回临时的
string
对象。而因为是临时的对象,所以它在整个表达式结束后将会被析构。 如果需要进一步操作
string
对象,先把其值赋给一个
string
变量后再操作...
将
vector
<
string
>写入文件,但文件大小与期望不一致
打算用
vector
装 1024 * 1024 * 64 个长度为 16 的
string
,...想了很久才悟到,
vector
上的对象是在
内存
上是连续的,但指的是
string
对象。
string
的内容未必在(应该完全不在)
vector
上。
vector
上的连续空
vector
和
string
、char*性能差异对比
c++,经常用到缓存,但缓存如何定义呢,一般我们使用void* 或char *作为存储的基本类型,对的缓存的操作定义也有多种方式,本文就常用的几种方式做了一...typedef basic_
string
b
string
; void test
string
() { b
string
vector
内存
释放 (记录)
vector
<T>
内存
释放
C++
vector
用法详解
C++
vector
用法详解
工具平台和程序库
24,854
社区成员
27,343
社区内容
发帖
与我相关
我的任务
工具平台和程序库
C/C++ 工具平台和程序库
复制链接
扫一扫
分享
社区描述
C/C++ 工具平台和程序库
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章