两个循环的效率

arden1019 2004-11-10 11:39:07
下面是c++ primer 中的两个例子:

使用cstring 的:
#include <iostream>
#include <cstring>
int main()
{
int errors=0;
const char *pc="a very literal string";
for (int ix=0;ix<1000000;++ix)
{
int len=strlen(pc);
char *pc2=new char[len+1];
strcpy(pc2,pc);
if (strcmp(pc2,pc))
++errors;
delete [] pc2;
}
cout<<"C style character strings : "
<<error<<"error occurred.\n";
}

使用string类:

#include <iostream>
#include <string>

int main()
{
int errors=0;
string str("a very long literal string");
for(int ix=0;ix<100000;++ix)
{
int len=str.size();
string str2=str;
if(str!=str2)
++errors;
}
cout<<"string class;"
<<errors<<"errors occurred.\n";
}

为什么使用string类的效率好一些?
...全文
170 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
arden1019 2004-11-11
  • 打赏
  • 举报
回复
thx ur all.
freefalcon 2004-11-10
  • 打赏
  • 举报
回复
主要是区别在
int len=strlen(pc);

int len=str.size();

前者每次都要重新计算长度,后者则是直接返回一个成员变量的值

如果string使用了缓式拷贝则更快,缓式拷贝就是当使用string str2=str;时,先让str2的内部指针与str的内部指针一致,即二者共享数据,等到调用会修改str2数据的方法时才拷贝出一份数据供str2使用,MFC的CString便是采用此方法
jitian81411 2004-11-10
  • 打赏
  • 举报
回复
同意楼上的string类中的函数进行了优化。
不过如果是用c来写东西的话就不能用string类了
只有用函数调用了!
fallhunter 2004-11-10
  • 打赏
  • 举报
回复

在string类中,对于像
strlen
strcmp
strcpy
等函数应该都进行了优化,所以效率高

比如strlen函数是从头开始计数到\0的,效率很低
冷月清晖 2004-11-10
  • 打赏
  • 举报
回复
一个是 函数调用
一个是 泛型算法

freefalcon 2004-11-10
  • 打赏
  • 举报
回复
.size这个成员变量在计算了一次以后,在main范围内就不用重新计算了么?还是...?

——string内部有一个成员变量标示当前字符串的长度,所以调用size()函数时,直接就返回这个值了,不用计算

实际上VC所用的P.J.编写的string也是采用引用计数+缓式拷贝的方式(没有细看其代码,初步看应该是如此),所以执行string str2=str;时也不会产生拷贝
fallhunter 2004-11-10
  • 打赏
  • 举报
回复

.size是个成员变量,
在改变串长度时会被改变。

而获取长度时就直接用它了
mathe 2004-11-10
  • 打赏
  • 举报
回复
最终要的是用string类,由于是个模板类,里面所有的函数都有源代码,所以所有的函数调用都可以直接被编译器展开(由于函数很小),这样,就可以避免了函数的调用,而且没有函数调用的循环编译器也特别容易优化。
在现在的计算机中,调用一个函数的代价是挺高的,特别是c版本的代码里面,这些小函数都分布在一个独立的库文件里面(不同的模块里面),在计算机调用其他模块的函数时,除了要保存上下文以外,还要保存段寄存器等信息。
rferen2003 2004-11-10
  • 打赏
  • 举报
回复
good question.i learn much from it.
arden1019 2004-11-10
  • 打赏
  • 举报
回复
to freefalcon :
.size这个成员变量在计算了一次以后,在main范围内就不用重新计算了么?还是...?



64,632

社区成员

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

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