免费注册 查看新帖 |

Chinaunix

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

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

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

resize是可能会初始化/销毁对象的。得考虑元素构造/析构开销的话还是指针吧。
vector本身不邪门,倒是“向量”这个翻译邪门。vector本来就兼有直观几何意义和代数意义两方面含义,并且以现代数学的观点来看后者才是本质。“向量”字面上只强调了一方面,数学课又先讲直观意义,难免有些误导。

上面有人说的move不会有内存复制也太绝对了点。基本类型的move和copy开销是一样的。就算对象里面只有指针成员,数量多了move也成问题(当然比deep copy是好多了),要是dereference相对move/copy操作频率少的话宁可再加一层指针。

论坛徽章:
0
22 [报告]
发表于 2012-04-19 12:41 |只看该作者
同意二楼,如果觉得内存拷贝都算慢的话,那就没有快的了

论坛徽章:
0
23 [报告]
发表于 2012-04-19 12:44 |只看该作者
回复 7# walleeee


    和push_back有什么关系

论坛徽章:
0
24 [报告]
发表于 2012-04-19 13:07 |只看该作者
回复 23# SpringfieldKing

即便是已经reserve了不重分配空间,push_back也得维护size,如果事先知道有多少的话就增加size的操作浪费了。
更何况很多人根本就没reserve的意识……

论坛徽章:
0
25 [报告]
发表于 2012-04-19 13:13 |只看该作者
回复 23# SpringfieldKing


你说有什么关系?

论坛徽章:
0
26 [报告]
发表于 2012-04-19 13:14 |只看该作者
walleeee 发表于 2012-04-19 03:47
总之,如果你非要用vector,并且知道要多大,那直接resize再用,如果你不知道多大,也非要用vector,那你可 ...


存指针要是用unique_ptr/shared_ptr复杂性倒是可以接受的。
通用不是意淫,尽管经常带来额外的麻烦。总之记住不会用就别装着会用、滥用就好。
至于泛型,不过是在给静态类型擦屁股而已(元编程什么的论外)。

论坛徽章:
0
27 [报告]
发表于 2012-04-19 13:18 |只看该作者
回复 21# 幻の上帝


你觉得把vector另外取的名字,比如array是不是对初学者更友好?或者叫dynamic array也行。
因为我只是感觉对一些常见数据结构的称呼是:数组,列表,平衡术。。。很少听到,向量,列表,平衡术。。。
况且大多翻译过来的书都使用数组,包括在用vector的时候都叫数组。这情何以堪。

“dereference相对move/copy操作频率少的话宁可再加一层指针。”
得不偿失。就跟我说的,内存这点操作都成了瓶颈,那真是骇人听闻。另外加层指针,数据局部性这些都要遭破坏。

论坛徽章:
0
28 [报告]
发表于 2012-04-19 13:29 |只看该作者
回复 17# redpigcool


C实现一些常规数据结构的简易之处在于我个人觉得抽象层次更高,根本就抛开了是不是个所谓的对象,直接面向内存,就是一块内存,没其他资源。这里,当然可能会有一些具体的初始化函数来构造内存之外的资源。

只是问题依旧,c一样要拷贝内存,反而在拷贝之后还需要去初始化其他资源,而没有c++类似的那种析构/构造机制。这个在c社区也是有很多人在需求,要求标准实现。c++在这里就比叫好用。

我觉得你不用在这里卡着,就按“幻の上帝”他说的来。当然他那个好像也有点问题
“resize是可能会初始化/销毁对象的。得考虑元素构造/析构开销的话还是指针吧。”
所以,你如果能估量,那就估量,如果不能估量,那就只用去用指针。自己看吧,我那个Alloc不适合你用,不花一些时间去理解他的设计,用起来非常容易出错,理解了就会达到我说的,根本没有任何内存浪费,一个指针都不浪费,对于你这个问题,也不会出现拷贝这些东西。

c++有他的好处,就你这里你就体会得出来,用c来搞这个,你觉得会更简单?况且还得自己去init/free,而不能构造/析构这种语言机制。

既然是计算密集型,那可以根据需要去设计数据结构,不一定非要套个stl。我之前就和ow说了,stl极易错用乱用,因为用起来实在太方便了。最后导致的问题太多。

论坛徽章:
0
29 [报告]
发表于 2012-04-19 13:39 |只看该作者
回复 13# 家住马戏团


不是c++不比c
你要初始化的还是得初始化,有什么区别?你c不外乎去另外人肉一个初始化函数,然后来人肉调用。复杂也主要不是和语言相关,而是问题本身复杂,随便你什么语言。你可以叫c--,c++,c,c-,c+,c=随便你,甚至叫你口述,依然是那么复杂。

这样在运行时动态创建,然后用完析构的话,耗时就很多

这里说的不错。所以你前面说的pool就有这个价值。但是内存却不必。因为内存是常态资源,放回去,拿出来,就这个成对操作是很快的,因为内存一般空闲链表的实现决定了。

“所以在程序的一开始创建足够多的对象,用pool保存,程序结束时释放”
这里也不是太好。我喜欢把废弃的,暂时不用的对象存起来,比如你用一个空闲链表也可以,让后需要的时候截一个。当然,这些小技巧,以及所谓的考虑对现在的操作系统和体系结构以及计算能力,意义没有以前那么大,而且确会大大产生复杂,因为除了问题本身,这里又带来了问题,问题终会产生复杂性。叠加。

这样节省下来的时间就颇客观,当然只在内存充裕的情况适用

某些特定场合是你说的这样,非常客观。但是看情况吧,关键要能认识到整体的优化点在哪里,而不是靠猜。

论坛徽章:
0
30 [报告]
发表于 2012-04-19 13:50 |只看该作者
回复 14# newmax123


你以为我没做过你说的所谓爬虫?

url长度我知道没有明确的说法,我给16k,至今没问题,你说什么?据我所知,url在设计的时候考虑一般4k足够,很多标准也假设了是4k最大,具体rfc我现在给你找不到想不起。

1k存path,你觉得有什么问题,溢出么?win的路径一般是255字符,最多也不过512,路径层次也不会太深,对于linux下面那些文件系统,1k一般足够99.99%,你还想要什么?100%么?我觉得一个程序能80%工作就够了。大于1k的我完全可以据掉,因为我要处理那么多数据,多一个少一个无关紧要。

不是“vector的push 成为你的瓶颈了吗”,而是你说的vector不必要的扩展生长导致了拷贝复制如此等等的操作。这些你用push_back这种接口,你能避免么?除了你说的指针,这个依然要拷贝指针,你说他不是瓶颈,对,他的确不是瓶颈,那你这里和之前存对象拷贝什么区别,依然拷贝指针,你说他浪费了么?我觉得是,因为依然要存指针。数组就是数组,该怎么就怎么。

终极办法 随机应变

哪里来的终极办法?算了,总之尽可能灵活的设计规避掉一些可以预料的问题,减少自己的麻烦。

你把 stl 源码看一遍以后

stl源码?哼。你以为我没看过?你太看不起人自以为是了。我看stl源码包括侯捷那本书是2,3年前的事情了。最后一次用stl也是2,3年前的事情了。还有《c++标准库扩展》这些就是放屁,《超越标准库boost》也差不多就是屁。
什么通用,什么泛型,什么可重用,真是想得美好。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP