免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: redpigcool
打印 上一主题 下一主题

问一个有关于c++ vector的问题 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-04-19 03:51 |只看该作者
回复 3# 幻の上帝


reserve是一个预估。必说的也不错,先reserve,然后直接获取地址下标来拷贝([]而非at这个,之间区别你懂)。最后来个resize。我不记得resize是否会重新去分配内存并把之前的无效。如果没有,那当然这么做也还勉强行。

vector这个名字也是个邪门,向量,呵呵,真想得出来。

论坛徽章:
0
12 [报告]
发表于 2012-04-19 03:54 |只看该作者
LZ这里还有个问题就是,是否过早优化?我觉得,即便就算是直接按照你原路的用,vector也不该成为整个程序的效率瓶颈(除非你就是个计算密集程序)。有空优化下磁盘,买个ssd来用用,或者优化下网络,这些都比优化内存更爽。

还有,调整高层面的结构有时候也会拿到意外的效率提升。但是这个比较难,别龙巧成拙。

论坛徽章:
0
13 [报告]
发表于 2012-04-19 06:48 |只看该作者
本帖最后由 家住马戏团 于 2012-04-19 06:49 编辑

回复 8# walleeee


    分配内存自然不会是瓶颈,但一些大对象的构造还是很耗时的,C++不比C,很多情况下构造函数里都会有复杂的初始化过程,这样在运行时动态创建,然后用完析构的话,耗时就很多。所以在程序的一开始创建足够多的对象,用pool保存,程序结束时释放,这样节省下来的时间就颇客观,当然只在内存充裕的情况适用。

论坛徽章:
0
14 [报告]
发表于 2012-04-19 08:56 |只看该作者
vector的push 成为你的瓶颈了吗?
瓶颈在于对象的构造?
用指针解决。  多次new 造成的内存碎片问题?  已经成为问题了?
简单办法 减少不必有的new delete. 复杂办法 pool 解决  终极办法 随机应变,选择一个适合的办法

1k buff 存放string 足够了? 业务环境不同毫无可比性,你做一下爬虫试试看。


在没有足够的水平前 不要妄图自己写一个自增长的array, 你的水平还不够。反驳我? 你把 stl 源码看一遍以后 再来谈这个问题。

论坛徽章:
0
15 [报告]
发表于 2012-04-19 09:05 |只看该作者
回复 6# redpigcool


    都有指针了,怎么还会不知道对象放在呢? 你不会是把所有的对象都放栈上吧.

论坛徽章:
0
16 [报告]
发表于 2012-04-19 09:19 |只看该作者
回复 10# walleeee


    一个设计良好的move函数, 是不会有内存,资源复制的.  本质上来说, move ctor就是旧的放弃所有权,新的获得. 用不着拷贝.

但很多时候事情并不都是那么完美. 这里所说的设计良好,限制还是挺多的. 比如, 一个新类的成员是另一个类的实例, 这个类可能是很久以前写的, 属于我们触碰不到的部分. 那些老代码自然不可能有move ctor了. 这种情况下给新类加move ctor是没有意义的.

存指针不存对象的另外一个重要原因是: 你不可能push_back 一个派生类的实例到存储基类对象的vector中去.

论坛徽章:
0
17 [报告]
发表于 2012-04-19 09:37 |只看该作者
walleeee 发表于 2012-04-19 03:54
LZ这里还有个问题就是,是否过早优化?我觉得,即便就算是直接按照你原路的用,vector也不该成为整个程序的 ...


恩,谢谢你的意见。我之前一直都写c,虽然麻烦点,但是自己都能控制。

但是现在要用别人写的c++的接口,必须要用C++,所以这个问题也只是提前想了想,因为我写的确实是超级计算密集型的程序,不是一般的应用软件。

感觉每个对象都new一下,然后再存指针这个方法不太可行,因为对象的数量级太大。哎要是能不用c++还真是不想用,用了c++又懒得自己写数据结构,毕竟有stl。

论坛徽章:
0
18 [报告]
发表于 2012-04-19 11:57 |只看该作者
这么纠结,你心里应该知道怎么解决,内存池也可以,自己写数据结构也可以,就是懒得写,妄想stl有解决方案,是吧?

论坛徽章:
0
19 [报告]
发表于 2012-04-19 12:29 |只看该作者
shanehan 发表于 2012-04-19 11:57
这么纠结,你心里应该知道怎么解决,内存池也可以,自己写数据结构也可以,就是懒得写,妄想stl有解决方案, ...


哈哈,是啊,被你说中了。既然都从c到c++了,当然希望能少写的东西,毕竟拖着stl那么大一个库。

当然如果实在不行,还是要自己写。。。

论坛徽章:
0
20 [报告]
发表于 2012-04-19 12:36 |只看该作者

向vector里放smart_pointer,
或者用boost里的侵入式容器。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP