这几天陪人玩去了,所以没怎么看书。今早某人回家了。所以我也就可以一个人继续开始在图书馆的浪荡之路了。爽歪歪!!!!而且可以一个人独占温暖的地方,实在是妙不可言。另外,特地感谢YYW同学,严重改良了我的睡眠质量,让我现在可以沾着枕头就睡着,这也是很欣慰的一件事情,YYW同学你安心的回家玩耍吧。我在这儿也还可以哦~~ 哈哈~~
一、数组与指针
对于C语言的新手来说,理解指针的存在是比较困难的一件事情。那么,我们可以通过对比利用指针与直接用数组的下标码值来看看指针的便利之处在哪儿。
有如下C语言程序:
void clear1(int array[],int size )
{
int i;
for (i=0;i<size;i+=1)
array[i]=0;
}
void clear2( int *array,int size )
{
int *p;
for (p=&array[0];p<=&array[size];p=p+1)
*p=0;
}
上述的程序中两者的作用都是一样的,把数组array内的所有数值清零,但是实现过程却是很不相同,一个是直接用的数组下标,另一个是用的数组首地址的指针。那么,我们从MIPS汇编程序上来看这两者之间的差异!
首先,用数组下标的代码如下:
//假设两个参数array 和 size 分别存储在 $a0 和 $a1中,i则保存在临时寄存器$t0中;
move $t0;$zero;
Cle1://此处不算一行
sll $t1,$t0,2;
add $t2,$a0,$t1;
sw $zero,0($t2);
addi $t0,$t0,1;
slt $t3,$t0,$a1;
bne $t3,$zero,Cle1;
下面逐行解释代码的含义:
其实我个人觉得,是不是第六第七句太麻烦,直接用一个 bne $t0,$a1,Cle1
就行了吧~?
那么我们的第二个基于数组指针的汇编程序是怎么样的呢?
//假设两个参数array 和 size 分别存储在 $a0 和 $a1中,p则保存在临时寄存器$t0中;
move $t0;$a0;
sll $t1,$a1,4;
add $t2,$a0,$t1;
Cle2://此处不算一行
sw $zero,$t0;
addi $t0,$t0,4;
bne $t0,$t2,Cle2
下面逐行解释代码的含义:
如果只循环一次,那么是差不多的性能,但是当这个数组进入一定的规模,那么我们就可以看出两者之间的巨大差距。
二、 ARMv8(x86)指令集中存在的一些谬误与陷阱
今天虽然存在了淡淡的离愁,但是好歹是为了下次的见面做铺垫不是?所以整体上我还是开心的,因为好歹吃上了百景园一楼的毛细牛肉面了。爽歪歪~~ 突然有点想家了!估计是因为最近我爸妈得知我读直博了所以很开心,然后我爸爸开始放浪形骸(证据如下图)。不仅如此,一天给我不下八个视频电话,虽然我至今才接了两三个,但是面对我爸的毫无松懈的攻势,我还是有点吃不住啊。不过隐约家里有活力了不少了。大抵是压在他们身上的一份重担(我?我!)即将消亡吧!希望我博士期间可以好好地念书,然后最起码解决自己的经济问题,最好是往家里打钱。总结一句:想家了,不如晚饭加个餐,夜间吃个关东煮犒劳下自己吧(我会告诉你我是因为懒和不想挤车才没回去?)!