看c++ primer上说,推荐在c++程序中使用string(c++准备库中一个类),而是不使用从c集成而来的c风格字符串(以null结束的字符数组),原因如下:
1)使用string安全,不用程序员管理内存分配释放
2)程序写起来比较简洁、方便、不容易出错
3)效率比较高
对于前2点,感觉是没什么问题,对于第三点就不是很明白,呵呵,以前一直以为后者比前者差呢。
书上有例子程序:
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
int main()
{
const size_t size = 20;
char pc[1000000];
for (size_t i = 0; i != 10 - 1; ++i)
{
pc[i] = ' ';
}
pc[999999] = '\0';
const size_t len = strlen(pc);
size_t time = GetTickCount();
for(size_t ix = 0; ix != size; ++ix)
{
char *pc2 = new char[len + 1];
strcpy(pc2, pc);
if (strcmp(pc2, pc))
{
delete [] pc2;
}
}
time = GetTickCount() - time;
cout <<"C style time is: " <<time <<" ms." <<endl;
string str (1000000, ' ');
time = GetTickCount();
for(int ix1 = 0; ix1 != size; ++ix1)
{
string str2 = str;
if (str2 != str);
}
time = GetTickCount() - time;
cout <<"C++ style time is: " <<time <<" ms." <<endl;
return 0;
}
运行结果:
c-style time is:93ms
c++ style time is:32ms
呵呵,很明显说明了string类的优势。但是自己不是很明白其中的道理,因为c++类的底层还是用c写的。
看了bbs上很多的说法,过多的说这个测试程序不是很合理,string str2 = str1并不是深层拷贝,不存在内存字节复制的问题。具体原因我也不是很清楚,不过我始终认为c-style的运行效率要高。
我国我还是觉得使用string开发效率倒是提高不少,说以我还是比较喜欢用string的。
昨天本人发了“我是教条主义者,请大家将标准C++进行到底”的帖子,网友对其中的一个细节---char *和string的效率---提出了不同看法,现回答如下:
Cybergate:您让我看《The c++ programming language题解》,但没有指明是那个地方,我姑且猜测是练习20。1(不知看对了没有)。
//两个string版本的
string dotconnect (string const &a, string const &b)
{
return a + '.' + b;
}
string dotconnect (string const &a, string const &b)
{
string result(a.size() + b.size() + 1, '.');
result.replace(0, a.size(), a);
result.replace(a.size() + 1, b.size(), b);
reutrn result;
}
//C风格版本的
char * dotconnect (char const *a, char const *b)
{
size_t alen = strlen(a), blen = strlen(b);
char *result = (char *) malloc(alen + blen + 2);
memcpy (result, a, alen);
result[alen] = '.';
memcpy (result + alen + 1, b, blen);
result[alen + blen + 2] = '\0';
return result;
}
作者提到,c风格的版本比string的第二个版本快了大约4倍,但是,正如作者所暗示的,这是一个不公平的测试,下面是另外一个更加不公平的测试,来自《C++ Primer》p82练习3。14。
int main ()
{
int errors = 0;
const char *pc = "a very larg literal string";
for (int ix = 0; ix < 1000000; ++ ix)
{
int len = srlen (pc);
char *pc2 = new char[len + 1];
strcpy (pc2, pc);
if (strcmp (pc2, pc))
++ errors;
delete pc2;
}
}
int main ()
{
int errors = 0;
string str("a very larg literal string");
for (int ix = 0; ix < 1000000; ++ ix)
{
int len = str.size();
string str2 = str;
if (str != str2)
++ errors;
}
}
这里的string版本比char *版本的快两倍。
不公平的大约是这两条语句。
int len = strlen(pc);
int len = str.size();
由于string显式存储长度,而strlen通过遍历整个串来确定长度,所以在执行了1000000次之后,两者的快慢显示出来了。
关于效率的问题,《题解》181面有着较为详细的分析,经过一番考虑后,我认为使用string代替char *,不仅能让我们避免很多麻烦,而且也不会丧失效率,甚至能提高我们的程序的效率(当然,如果您能确定不会出错而且效率问题很重要的话,我也不反对您使用char *)。
实际上各个不同的实现也有着不同的效率,原则上string可以有着非常高的效率,所以,不要简单的认为string的效率不如char *.
再次提倡大家使用 string。同是欢迎任何对我的批评。
ACM的赛手们用来竞赛是很少用STL的,它们知道效率绝对比不上一段优秀的C代码
最后还有一点,对于某些STL实现,如果=两边内容一样, STL将不进行复制.
如果你一定要比较, 第一段代码应该改进成:
int main ()
{
int errors = 0;
const char *pc = "a very larg literal string";
int len = srlen (pc);
char *pc2 = new char[len + 1];
strcpy (pc2, pc);
for (int ix = 0; ix < 1000000; ++ ix)
{
if (strcmp (pc2, pc))
++ errors;
delete pc2;
}
}
你再比比?
就运行速率而言, C绝对比C++快, 但前提是你必须是一个较好的并有一定算法分析基础的C程序员.
---------------------------------------------------------------
抱歉,请把delete pc2也提出到循环体外面.
---------------------------------------------------------------
这样测试吧,
分别在函数中的开始和结束加入GetTickCount获取时间,看看到底谁用的时间多。但个人认为,代码量大并不是主要因素,string由字符组成,我们看到的string只不过是一个封装体,所以我认为从效率上说,是char*快的。这就是方便与效率的矛盾。
总结:
要是真的比效率,对于能力强的C程序员,那么会发现C的char 比 C++中的string要快,但对于普通程序员string的效率会高些,操作也方便,相对整个工程效率要高