社区
C++ 语言
帖子详情
关于char *和 string的效率问题
zpk1234
2007-11-03 03:22:10
两个效率谁高啊,在我的机子上测试是前者高,而C++primer 上说的是后者高,有点不一样
...全文
419
14
打赏
收藏
关于char *和 string的效率问题
两个效率谁高啊,在我的机子上测试是前者高,而C++primer 上说的是后者高,有点不一样
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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
好象差的挺多的啊
C
String
std::
string
char
* 的转换
C++中
string
、
char
*、
char
、int的相互转换
1.
string
转换成
char
* 1️⃣ data()方法
string
str = "hello world"; const
char
*p = str.data(); //加const 或用
char
*p = (
char
*)str.data(); 的形式 注:若不加 const,编译时会报错:无法从 “const
char
*” 转换为 “
char
*”; 2️⃣ c_str方法
string
str = "hello"; const
char
*p = str.c_str(); //同上 3️⃣c
map的key 为指针
STL中map的key能否用
char
*呢?当然可以! 在程序中需要用到一个map,本来是这样写的,map<
string
, int> mapStr; 为了追求
效率
,把
string
改成了
char
*,map<
char
*, int> mapStr;结果呢?可想而知,每次放进去的是指针,当查找的时候就出
问题
了,总是找不到。因为key中存放的是指针,当然...
PAT真题(C/C++)——1047:Shopping in Mars
这道题遇到的
问题
和上一道相同,都是超时。 最初我是用set数组,根据课程,按序存放每个学生的名字,学生名字使用
string
存放,这样做就导致了超时,然后把set换成了vector,并编写了名字排序的比较函数,每一个课程都自行进行一次名字排序,依然超时,再然后把
string
换成了
char
数组,继续超时,最后的最后,把名字存放在一个数组里,用数组下标代替名字,最后成功AC。 那么,为什么换成了数组下...
CEGUI::
String
类分析
CEGUI::
String
类算是一个不错的类,但是说实话,这个类让非英文国度的IT们不是很舒服。比如,自我们学习C++编程以来,我们一直使用这样的输出语句: std::cout 其中"名字:"使用的是多字节编码(ASCII编码的扩充版本)。我们的控制台能正确显示这些中文文本。但是当我们初次了解并使用CEGUI的时候,却无法使用这样简单的功能: CEGUI::
String
str
C++ 语言
65,214
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章