您的位置:首页 > 其它

第六章家庭作业

2015-11-11 16:50 169 查看

第六章家庭作业

6.43(两星),6.44(两星)

6.42(未选)

首先6.43(两星),6.44(两星)这两道题是根据6.42改变过来的,6.42中采用嵌套循环,将buffer中的所有数据清零

pixel类型的结构体

struct pixel{
char r;
char g;
char b;
char a;
} ;

二维数组buffer定义为pixel类型,这个类型的结构体中含有四个数。首先cptr指向buffer[0][0].r(即第一项)时,后面的buffer[0][0].g,buffer[0][0].b,buffer[0][0].a均未被读入,所以第一次未命中,因为一行四个字节,所以读入buffer[0][0].r时把后面三项也读入了,这样再访问buffer[0][0].g等三项时均命中。所以不命中率为25%

6.43

将6.42中的嵌套循环改为以下代码

//sizeof(char)==1;
char *cptr = (char*)buffer;
for(;cptr<(((char*)buffer)+640*480*4);cptr++)
*cptr=0;

代码依旧是将数组清零,第一行把数组从pixel类型转为char类型,cptr首先指向buffer数组的起始位置,依次往后,初始为空,cptr指向buffer[0][0].r高速缓存不命中,然后高速缓存把4字节数据都调到自己的第一行,后三个就会命中,这样就同6.42中结果一样,不命中率为25%

6.42

将6.42中的代码修改如下

//sizeof(int)==4;
int *cptr = (int*)buffer;
for(;cptr<(((int*)buffer)+640*480);cptr++)
*cptr=0;

因为int本身就是4字节的,而第一行将buffer从pixel型强制转换为int型,所以cptr每指向数组一次,就一次指向了原结构体中的四项。首次cptr指向buffer[0][0]高速缓存不命中,高速缓存把4字节的数据调入,第二次cptr指向buffer[0][1],高速缓存再次不命中,所以此时的高速缓存不命中率为100%。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: