C风格字符串和std string风格字符串效率?

yangyunzhao 2009-06-27 11:59:23
一直以来,我都认为C风格的字符串处理起来效率高。今天看书C++ Primer的时候才发现原来std string风格的字符串比C风格字符串的效率高了不是一点点啊!!
请大牛现身讲讲原理吧。我个人之前以为C风格字符串就是一个数组,内存中连续排列,应该很快。
而std string的字符串,是一个类,每次使用还要构造、析构一番。虽然是自动的,但是应该费时啊。所以尽量使用C风格字符串。好像我们公司的人,也基本都是有C风格字符串。上次写东西用了std string还被小小鄙视了一下。

// C-style character string implementation
const char *pc = "a very long literal string";
const size_t len = strlen(pc +1); // space to allocate
// performance test on string allocation and copy
for (size_t ix = 0; ix != 1000000; ++ix) {
char *pc2 = new char[len + 1]; // allocate the space
strcpy(pc2, pc); // do the copy
if (strcmp(pc2, pc)) // use the new string
; // do nothing
delete [] pc2; // free the memory
}
// string implementation
string str("a very long literal string");
// performance test on string allocation and copy
for (int ix = 0; ix != 1000000; ++ix) {
string str2 = str; // do the copy, automatically allocated
if (str != str2) // use the new string
; // do nothing
}
// str2 is automatically freed

...全文
686 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿凯9527 2012-07-26
  • 打赏
  • 举报
回复
非常不公平,主要是new delete 废时间。
saturnman 2010-02-17
  • 打赏
  • 举报
回复
该有能调整自己的代码,不同情况自动调整自已。
老邓 2009-06-27
  • 打赏
  • 举报
回复
引用计数效率虽高,但有致命缺陷:线程不安全
ATL 9 的CString就没有使用引用计数,所以其效率比C风格字符串要低不少。
老邓 2009-06-27
  • 打赏
  • 举报
回复
std::string效率高的原因是使用了引用计数,其实是不公平的对比。
如果不使用引用计数的话,要比C风格字符串的效率低的多。
飞天御剑流 2009-06-27
  • 打赏
  • 举报
回复
看来以后啊,要尽量利用库函数去写代码,编译器对它们的优化可不得了。
飞天御剑流 2009-06-27
  • 打赏
  • 举报
回复
测试了一下两段代码的执行时间,c-string耗时是string的3.16倍,书中的5.42倍夸张了一点,不过3倍的差别还是很可观。

开始我以为是c-string那段用了很多字符串处理函数带来的开销导致的,就用while( *p1++ = *p2++ );代替了strcpy(pc2, pc),我靠,竟然比

原来用strcpy耗时还多了0.2秒。


我发现被编译器搞了个大忽悠。

strcpy的库函数很可能是用类似MOVS的串指令执行的,while循环大概就用了逐个字节复制了,说不定还是先传到寄存器再存回内存的!否则怎么可能会比它

还慢呢。
amossavez 2009-06-27
  • 打赏
  • 举报
回复
看看这篇文章吧,我感觉效率不能单从运行方面说,要综合来说,比如说维护,易出错性等
http://hi.baidu.com/informan/blog/item/86faa9d4d66e6a05a08bb765.html
zhhy123 2009-06-27
  • 打赏
  • 举报
回复
string分配内存的时侯不是分配实际大小,而是分配64,128,256,512等量子单位
这样,连接两个字符串的时候,就不需要复制第一个字符串到新的内存区,只需要将第二个字符串
复制到第一个字符串的后面,当然如果第二个字符串太大的话也需要把第一个字符串复制到一个足够大的新
内存区
而用char通常是两个字符串都要复制的
edwinlxming 2009-06-27
  • 打赏
  • 举报
回复
正好也看到这里,呵呵
聆听详解
yangyunzhao 2009-06-27
  • 打赏
  • 举报
回复
2楼的朋友,我就是不懂才来问啊。我开贴是求知,而不是布道。
lijinfenghust 2009-06-27
  • 打赏
  • 举报
回复
我是因为以前也发现了这个效率问题,但始终搞不懂为啥会这样。。。下面是我以前发的帖子,所以才问。。。
http://topic.csdn.net/u/20081211/16/16934314-3960-4ab4-a8fd-6295ccb5bd7a.html
aaaa3105563 2009-06-27
  • 打赏
  • 举报
回复
我也经常被BS 哇哈···
lijinfenghust 2009-06-27
  • 打赏
  • 举报
回复
楼主能讲解一下std::string比c-style string 效率高在哪里么?
除掉用实验证明的方法?
yangyunzhao 2009-06-27
  • 打赏
  • 举报
回复
书上说的:
平均来说,使用 string 类型的程序执行速度要比用 C 风格字符串的快很多,在我们用了五年的 PC 机上其平均执行速度分别是:

user 0.47 # string class
user 2.55 # C-style character string

lhy 2009-06-27
  • 打赏
  • 举报
回复
应该主要考虑开发效率吧,那点运行时间算得了什么。
liao05050075 2009-06-27
  • 打赏
  • 举报
回复
这个要看你具体使用时,大部分时间是用string在做什么了。如果你狂在那里拷贝,那么使用了引用计数的string自然快很多。
如果你狂在那里修改字符串,那么C-style的string会高效一些

64,632

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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