遍历元素,下标和指针,谁快些?

C加伽 2014-04-23 11:05:18

//下标方法:
string s1;
string s2;
while(cin>>s1)
{
if(s1=="exit")
break;
s2+=s1;
}
for(string::size_type i=0; i!=s2.size(); i++)
cout<<s2[i];



//指针方法
string s1;
string s2;
while(cin>>s1)
{
if(s1=="exit")
break;
s2+=s1;
}
char const *p=s2.c_str();
for(char const *q=p+s2.size(); p!=q; p++)
cout<<*p;

...全文
230 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
乐百川 2014-04-24
  • 打赏
  • 举报
回复
可能一样吧……迭代器算不算一种
晨星 2014-04-24
  • 打赏
  • 举报
回复
反汇编一下看看。开启 编译器优化之后,目标代码可能是一样的。
赵4老师 2014-04-24
  • 打赏
  • 举报
回复
参考OpenCV相关源代码。
lidowx 2014-04-24
  • 打赏
  • 举报
回复
肯定指针快,下标还要执行重载的函数
tbwork 2014-04-24
  • 打赏
  • 举报
回复
指针快点吧。 你可能是想知道指针访问和数组访问的区别吧? 两个方面: (1)从单次读取第i个元素来说,汇编角度 int a[p] ; int * b =new int[p]; 现在如果要访问a[i] 和 b[i], 寻址方式分别为: a[i], 首先系统会存储 a[0]的地址, 那么a[i]的地址为: a[0]+sizeof(int)*i; b[i], 或者是 *(b+i) , 首先系统会去读取指针b的值,这是个内存数,读取之后再赋值给总线地址变量,然后加上 sizeof(int)*i; 所以从读取某个元素时,肯定是a[i]快,根本差异在于 系统存储a[0], 而对于int*b; 存储的是 b的值。 (2)从循环遍历元素来说 比较下面两个差别: for(int i=0;i<size; i++) a[i] = some_number; for(int *p=b; p< b+size;p++) *p = some_numer; 这两者的区别在哪? 第一种情况, 访问 a[i], 是用 a[0] +sizeof(int) *i 的方式。 而第二种情况,反问 *p, p已经是地址,所以无需做任何运算,并且,每次p的变化都只是 +1 ,没有用到乘法运算。 所以从遍历的角度来看,指针方式更加快。 —————————————————————————————————————————— 不过,需要说明的是,现在的编译器优化好像可以做到把这种数组遍历方式优化成递增访问的汇编代码。 所以在写二维数组a[i][j]访问的时候要 先递增j,再递增i,就是为了让编译器做优化。 so
引用 1 楼 steedhorse 的回复:
反汇编一下看看。开启 编译器优化之后,目标代码可能是一样的。
二楼说的不无道理。
「已注销」 2014-04-24
  • 打赏
  • 举报
回复
速度上差不了太多,直观感觉指针优势一些
derekrose 2014-04-24
  • 打赏
  • 举报
回复
不优化的话指针快一点 直接寻址

65,207

社区成员

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

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