今天面试面试官让读下面这段代码,然后说出代码作用,看了10分钟后被面试官打断,真没看出这代码到底是做什么的,取得面试官同意后拍照,自己在电脑上跑了跑,没看出这到底是要干什么.
void send(int* to, int* from, int count)
{
int n = (count+7)/8;
switch(count%8) {
case 0: do{ *to++ = *from++;
case 7: *to++ = *from++;
case 6: *to++ = *from++;
case 5: *to++ = *from++;
case 4: *to++ = *from++;
case 3: *to++ = *from++;
case 2: *to++ = *from++;
case 1: *to++ = *from++;
} while(--n>0);
}
}
其实真正的结构是这样的:
void send(int* to, int* from, int count)
{
int n = (count+7)/8;
switch(count%8) {
case 0:
do
{
*to++ = *from++;
case 7: *to++ = *from++;
case 6: *to++ = *from++;
case 5: *to++ = *from++;
case 4: *to++ = *from++;
case 3: *to++ = *from++;
case 2: *to++ = *from++;
case 1: *to++ = *from++;
} while(--n>0);
}
}
64位机器上加速内存复制用的
达夫设备
https://blogs.oracle.com/weixue/entry/duff_s_device_%E8%BE%BE%E5%A4%AB%E8%AE%BE%E5%A4%87
貌似是在拷贝数组, (count + 7) / 8
是在计算循环次数,主要是考虑有余数的情况,而且避开 0,因为
(0 + 7) / 8 == 0;
(1 + 7) / 8 == 1;
...
(8 + 7) / 8 == 1;
(9 + 7) / 8 == 2;
所以可以认为是把从 0 起始的数组变成了从 1 起始的数组,而且按 8 个一组分
case 可以当 label 看待,switch 只有第一次循环有效,也就是处理余数部分,比如 count = 12 的时候直接从 4 开始但一轮循环完成下一个循环的时候肯定是从 7 开始的。
看程序大概是这么回事