| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 765 人关注过本帖
标题:运行速度讨论
只看楼主 加入收藏
jerry820726
Rank: 1
等 级:新手上路
帖 子:67
专家分:0
注 册:2006-3-17
收藏
 问题点数:0 回复次数:13 
运行速度讨论
#include <stdio.h>;
void main()
{
char a = 1;
char c[] = "1234567890";
char *p ="1234567890";
a = c[1];
a = p[1];
return;
}

在读取时a = c[1];a = p[1];中哪个存取更快些啊? 为什么
搜索更多相关主题的帖子: 速度 运行 
2006-08-30 16:58
yeshirow
Rank: 4
等 级:贵宾
威 望:10
帖 子:854
专家分:0
注 册:2006-6-8
收藏
得分:0 

看一下生成的組合代碼(Asm-code)
------------------------------
我也不清楚啊, 下面是摘自 某書的內容:

.....
所以, 對於實在太長的字串, 索引實現法就會優勝於指針法. 爲甚麽呢? 大部分取決於指令隊列. 在舊式電腦上, 如一台 80486, 第二個循環 (是指指針遍曆) 證明排列得更好, 所以代碼運行得更快.
在指針實作代碼中, 一些附加的指針演算法在結尾處進行; 在索引實作代碼中, 測試在進入循環前進行---然後才重復執行幾次循環. 同樣在我的電腦上, 索引方案比指針的開銷要少, 所以, 對於多達 3 個字元的字串, 索引方案勝過了指針方案.
.....
--------------------
書名: <<C++ 實踐之路>>


原來朋友仔感情再天真, 亦是我永遠也會愛惜的人, 明日愛他人, 也記住學會不要緊; 原來朋友比戀人更高分, 亦讓我開始懂得不記恨, 若大家都敏感, 我更要永遠記得拒絕再因小事怪人, 爲何沒有這條校訓...Twins-朋友仔 MCSD Training
2006-08-30 17:08
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
a = c[1]比a = p[1]快,后者少了一次指针变量数值的读取,不过现在的计算机速度应该不在乎这个吧
另外c在栈中需要占用和字符串相同大小的数组空间(因为字节对齐的问题可能更多),而p不需要,只需要一个指针变量的空间

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-08-30 17:23
jerry820726
Rank: 1
等 级:新手上路
帖 子:67
专家分:0
注 册:2006-3-17
收藏
得分:0 

恩 明白了


2006-08-31 09:06
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
对第二种写法char *p ="1234567890";有点意见。按照C++中的规矩:用这种方法生成的临时object在当前statement结束后就被destruct掉了,再访问其内存的时候就是无效内存(deallocated memory)没准还能看到但只是运气了。所以这行要是string *ps = string("1234567890")的话旧肯定不对了。但这里的*p生成的是string literal,不是C++的object,所以我不很确定是否这行执行之后其在内存中还有效(还存在不能说是有效)。哪位知道答案呀?

http://myajax95./
2006-08-31 11:12
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
以下是引用myajax95在2006-8-31 11:12:08的发言:
对第二种写法char *p ="1234567890";有点意见。按照C++中的规矩:用这种方法生成的临时object在当前statement结束后就被destruct掉了,再访问其内存的时候就是无效内存(deallocated memory)没准还能看到但只是运气了。所以这行要是string *ps = string("1234567890")的话旧肯定不对了。但这里的*p生成的是string literal,不是C++的object,所以我不很确定是否这行执行之后其在内存中还有效(还存在不能说是有效)。哪位知道答案呀?

这里没有临时对象,字符串"1234567890"是存在全局数据区,p是个指针变量,指向全局数据区的该字符串地址,你可以试试在不同的函数中定义指针指向"1234567890"字符串。地址都是一样的


世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-08-31 11:39
myajax95
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:30
帖 子:2978
专家分:0
注 册:2006-3-5
收藏
得分:0 
是常数数据区吧?记得C++ Programming Language里说过,常数的指针指向同意内存还是不同内存是编译器的implementation决定的,不是Standard规定的,也就是说,不同编译器可以指向相同的或者不同的内存。大约第十几章里说的。

[此贴子已经被作者于2006-8-31 12:06:25编辑过]



http://myajax95./
2006-08-31 12:03
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
收藏
得分:0 
以下是引用aogun在2006-8-30 17:23:18的发言:
a = c[1]比a = p[1]快,后者少了一次指针变量数值的读取,不过现在的计算机速度应该不在乎这个吧
另外c在栈中需要占用和字符串相同大小的数组空间(因为字节对齐的问题可能更多),而p不需要,只需要一个指针变量的空间

是一样的


偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-08-31 12:07
穆扬
Rank: 1
等 级:禁止发言
帖 子:1910
专家分:0
注 册:2006-6-1
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽

2006-08-31 12:12
baidu
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:3811
专家分:0
注 册:2005-11-4
收藏
得分:0 
程序代码:
//

#include "stdio.h"
#include "conio.h"

main()
{
    int a[]={1,2,3,4,5,6,7,8,9,0};
    int *b=a;
    int c,n;

    c=a[3];//12行
    n=b[3];//13行
}

程序代码:
;    ?debug    L 12
    mov    ax,word ptr [bp-18]
    mov    word ptr [bp-4],ax
;    ?debug    L 13
    mov    ax,word ptr [si+6]
    mov    word ptr [bp-2],ax

偶放弃所有文章版权,偶在BCCN论坛任何贴子,可转贴,可散发,可抄袭,可复制,可被冒名顶替,可被任何人引用到任何文章中且不写出引文出处,偶分文不取。
2006-08-31 12:17
快速回复:运行速度讨论
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018164 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved