第六章家庭作业

第六章家庭作业

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%。

原文地址:https://www.cnblogs.com/shadow135211/p/4956432.html