关于char *和 string的效率问题

zpk1234 2007-11-03 03:22:10
两个效率谁高啊,在我的机子上测试是前者高,而C++primer 上说的是后者高,有点不一样
...全文
320 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
loops 2007-11-05
  • 打赏
  • 举报
回复
debug和release差别很大,比如调用函数的时候,debug下面要将函数所分配的栈都置为0xcccccccch,string调用的函数要比上面的new和delete多得多,因此首先在这方面开销就大,其他微软为了发现错误,还在debug下增加了很多代码,比如检查栈等等。尽管debug下new和delete也有这方面的额外开销,但是string更加复杂,做得更多,导致这些额外的开销掩盖了实质。
zpk1234 2007-11-05
  • 打赏
  • 举报
回复
Release和Debug有什么区别啊,在Release下后者是前者的1/3,而在Debug下后者比前者稍多,这是为什么?
jxlczjp77 2007-11-05
  • 打赏
  • 举报
回复
使用char *,就不得不检查有效性.
而用string的话假设它是安全的,不再需要额外检测.

这就与引用和指针一样,引用默认总是需要指向一个对象,所以使用时不需要再额外检查(当然了,这并不绝对,比如引用到一个失效的指针)。而使用指针则几乎总是需要测试有效性.
yuyunliuhen 2007-11-04
  • 打赏
  • 举报
回复
测试后者快点
g961681 2007-11-04
  • 打赏
  • 举报
回复
up
loops 2007-11-04
  • 打赏
  • 举报
回复
换在Release下试试。Debug下面函数调用的开销太大,误差大。
我在vc6 release下,后者时间只是前者的三分之一。
毕竟COW机制要比反复new和delete高效多了。

cctdbnj 2007-11-03
  • 打赏
  • 举报
回复
楼主用的什么编译器,我用dev-c++时后者耗时少些,分别是:328,172;而用vc分别是843,938
tangshuiling 2007-11-03
  • 打赏
  • 举报
回复
严格来说:char*比string还是要快点,只是微不足道。起码string类还要调用构造,析构甚至拷贝构造函数等!
就安全性来说,用string比用char*要来的更加稳当。牺牲了微弱的时间保证了安全性,评价嘛一个字———值!
Lstyk 2007-11-03
  • 打赏
  • 举报
回复
标准库中的string不知道具体是如何实现的,感觉应该是链表一类的,我觉得对于赋值、访问一类的操作,数组会快一些,而对于那些要在串后面增添成员的操作,考虑到数组要确定有足够的空间(否则要重新定义数组,分配空间,然后复制到新数组),string应该更方便、快一些。
或许是这样吧。
zpk1234 2007-11-03
  • 打赏
  • 举报
回复
请问nevergone 该如何测试
CedarDiao 2007-11-03
  • 打赏
  • 举报
回复
你在Win32测速是不会很准的,建议LZ将以上测速语句中的执行体反复执行10000次,放大结果看看
shizhiqing2003 2007-11-03
  • 打赏
  • 举报
回复
呵呵,当然要差点了
nevergone 2007-11-03
  • 打赏
  • 举报
回复
你不能这样比较呀
zpk1234 2007-11-03
  • 打赏
  • 举报
回复
贴上代码:

#include <iostream>
#include <string>
#include <cstring>
#include <cstddef>
#include <ctime>

using namespace std ;

const int N = 1000000 ;

int main()
{
const char *pc = "a very long literal string" ;
const size_t len = strlen( pc) + 1 ;

double start,finish; // 开始时间,结束时间

start=(double)clock();
for( size_t i = 0 ; i != N; ++i )
{
char *pc2 = new char[len+1] ;
strcpy(pc2,pc) ;
if( strcmp(pc2,pc) ) ;
delete [] pc2 ;
}
finish=(double)clock();
cout<<"所用的时间为(毫秒):"<<finish - start<<endl ;


string str("a very long literal string") ;
start=(double)clock();
for( i = 0 ; i != N; ++i )
{
string str2 = str ;
if( str2 != str ) ;
}
finish=(double)clock();
cout<<"所用的时间为(毫秒):"<<finish - start<<endl ;

return 0 ;
}

运行时间为:
前者: 766
后者: 890
好象差的挺多的啊

64,282

社区成员

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

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