读<代码揭秘>总结

来源:互联网 发布:剑三遗失的尊敬淘宝 编辑:程序博客网 时间:2024/06/06 02:54

         哎,好久没写过总结了,更没在这个博客发表过什么了!最近感觉对于已经阅读过的书籍如果不加总结,总感觉少点什么,最大的感觉就是貌似自己什么也没学到!看了一本书等于没看,所以还是觉得很有必要写下总结,以求精进,看到自己的进步!

    最近刚看完了<代码揭秘>中的大部分内容,对于自己已经熟悉的就没怎么看了!这里主要是总结下自己感触印象最深的地方也是自己以前不曾注意的地方!

    大致内容如下:

         <1>汇编代码解释源代码

        <2>全局变量与static的不同以及局部变量的存储

        <3>存储器的结构方面

        <4>高效代码的编写

        <5>缓存与主存的映射方式方法


1.汇编代码解释与源代码

貌似虽然现在我知道一点汇编的知识,但是具体应用在什么地方还不慎了解,(菜鸟一枚)忘大神指教一二:

问1:源代码解释成汇编代码具体应用于何处?

接下来就是看下简单的vc6上的反汇编以及相关的运用看图一下是测试代码:




上面是测试中的程序在选择语句中其实就用到了汇编中的跳转jne 和无条件跳转jmp,我觉得有时候看汇编代码可以看到些本质的东西

2.全局变量与static的不同以及局部变量的存储

前几天我就被问到了个问题当时还真无法解答就是关于全局变量与static变量的不同之处,据书上讲解全局变量与static变量都是存储在静态存储区域的,那他们有什么不同呢?首先我们来看下下面代码:

#include<stdio.h>
int i;


int cmp(int a,int b)
{
static int j;


if(a>b)
{
j++;
}
else
{
j+=2;
}


return -1;
}

int cmp2()
{
  j++;
  return j;
}
int main(int argc,char* argv[])
{
printf("leave space");
return 0;
}
上述中全局变量i与j的不同之处在于对于i,在整个文件中都可以使用,但是对于j却只能在函数内使用,只是它的值在一次函数执行完成后并不会被清空而是继续保持!大家觉得cmp2函数正确吗?答案是:否! j是不能用在cmp2中的,所以这就是static的不同之一;


问题二:求大神指教关于全局变量与static的其他不同之处!
3.存储器的结构方面
这里我主要要分享的是cpu,寄存器,缓存,主存,辅存的结构安排!
我们都知道设计缓存的目的是:缓解cpu与主存之间速度不匹配的原因!(或许不精确望指正^*^)
他们的结构大致如下:




其实大多一级缓存和寄存器都是和cpu设计在同一块芯片上的,其目的就是加快取指令或者数据的速度!而辅存主要是用于存放数据的,代码执行时程序都是需要被装载到内存中的!关于更多的东西大家可以查查其他资料这里主要作简单的介绍
 4.高效代码的编写
这里主要是讲解下,有时候我们在写代码的时候,要注意一些细节以提高代码执行效率:举例如下,
char ch[20]="the campus is beautiful";
for(int i=0; i<20; i++)
{
  putchar(getsinglechar(i));
}
getsinglechar(i)的作用是取得ch中的单个字符; 


且不考虑上面的代码是多么的弱智(呵),此处只是来说明下问题!
以上的getsinglechar(i)这个函数在每次调用时都会执行相应的查找操作,所以每次执行循环体都会耗费相当的时间;
在考虑下面的代码:
char ch[20]="the campus is beautiful";
for(int i=0; i<20; i++)
{
  putchar(ch[i]);
}
而上面的代码代码可减少相应的执行耗费时间!具体时间测试大家可以用GetTickCount() 或者更精确的精度在1ms的时间内函数来测试相应的执行时间!所以我们在写代码时,应该有所取舍!
问题三:大神介绍其他的高效代码编写相关书籍!拜谢(^*^)
5.缓存与主存的内存块的映射方式方法
简单的介绍下这几个方法!
这里主要在缓存与主存相应的存储单元进行映射!映射方法主要包括组相连映射,直接相连映射以及全相连映射!关于这方面内容由于刚好学了<计算机组成与结构>有相关章节介绍过了,所以只是提下!有兴趣的可以去了解下!
请有空的大神解答下以上三个问题!