最近又对 C 的陷阱和奇怪的用法之类的感兴趣了,于是又想写点东西,完全是主观感觉奇怪的或者是感觉是陷阱就写出来了,外加无责任分析,错了还请大家斧正……
今天写第一篇,希望以后能多写点……
先上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| send(to, from, count)
register short *to, *from;
register count;
{
register 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);
}
} |
看懂了的话下面可以无视了……请轻轻按下左上角或者右上角的X……
可以看出,这短代码是用来复制内存的(请别告诉我你看不懂旧式的函数首部),就像 memcpy,一般人可能会写出类似下面的代码:
1
2
3
| do { /* count > 0 assumed */
*to = *from++; /* Note that the ''to'' pointer is NOT incremented */
} while (--count > 0); |
这两段代码的区别是上面的一个,也就是 Duff's device 用了叫做循环展开的技术,观察可以发现,下面这段代码循环体很短,也就是说循环条件的判断在循环执行的时候占用了很大一部分的时间,而循环展开后循环条件所占用的时间下降了,从而提高了程序的效率。
其实 Duff's device 里面最神奇的就是 switch 跟 while 交错出现。示例中循环展开了 8 次,第一次 switch 的时候首先处理被 8 除余下的 count%8 次,然后 while 循环处理 8*(n-1) 次,这样就正好凑齐 count 次复制了。这个 8 次是可以改的,愿意的话可以改成 16 次?不过展开越多二进制的大小就越大,也算是用空间换时间了。
至于你问我为啥是 *to 而不是 *to++,我只能告诉你那个指针 to 不是一般的指针,而是 memory-mapped output register,按我的理解大概是它能自动增长吧?参考资料里说新手可能不知道 memory-mapped output register,所以有时候就改成 *to++ 了,嗯,我是新手。谁知道是怎么回事告诉我一声?查了一些还是不太懂……
另外,Duff's device 也不是说一定能让代码变快,有人就说了,我去掉这些烦人的 Duff's device 之后反而快了。
References:
http://en.wikipedia.org/wiki/Duff's_device
Tags:
C++
Related Posts
今天老爸弄回来一张联通上网卡,ZTE MF637,于是插上试试,过了一会识别出来一个U盘,里面是驱动,.mpkg 的,很激动,于是装上了,然后就悲剧了……
装好之后能上网了,速度不错(废话),但是打不开 Netword Preferences 了……以为重启能解决,于是重启了,然后卡在苹果标的地方了,一直转啊转啊……启动都启动不起来了……
(省略中间各种尝试万字……)
于是祭出雪豹的光盘,安装……安装过程跟第一次安装不一样,完全是无需人工干预的,于是我很不爽,打开 log 一直在看,安装了好一会之后 OK 了,重启之后竟然什么都没丢(我以为像 Windows 一样程序起码没了),应用程序都没丢,文档当然也没丢,只是 Xcode 没法运行了,因为操作系统版本太低……于是现在正在下载接近 1GB 的更新,10.6->10.6.4……
ZTE(中兴)还是好不靠谱啊……运行了一年多没见过四国(据说现在五国了?)的系统让它一下搞崩溃了……还是苹果靠谱(在说天线门吗?),插进安装盘一会就恢复如初。要说原因,是那个驱动不支持雪豹,把系统中的一个文件(libcurl.4.dylib)替换成自己的版本了,而它的版本没有 64 位的二进制,于是崩溃了……你装个驱动起码检测一下当前操作系统版本吧……
考据党移步这里……
中兴你浪费我一下午!
PS:新的上网卡似乎有支持雪豹的驱动,网上似乎也有下载。
Tags:
Mac,
Snow Leopard,
ZTE
Related Posts
历经千辛万苦之后,我终于搬到 Media Temple 了……
具体就不说了,目前还有点小问题,不过没大碍,大家看到这篇 post 就说明基本正常啦。
Tags:
blogging,
DreamHost,
host,
mt
Related Posts
今天是大一下开学前一天,宿舍里的网络该买卡续了,我们这是包月的卡,每月换。
我们宿舍就一个能用校园网上网的,而且旁边的超市没开,于是就准备去淘宝买,看好货,拍下,付款,卡通余额不足……不知道啥时候卡上已经没钱了……
于是去存钱,我是带了点现金来学校,没有往卡上打钱,于是冒雪来到新主楼,插卡,输密码,然后发现存款和取款那里都打着叉号……仔细一看发现,ATM 机上写着“本积攒不提供存款和取款功能”,不能存款取款叫什么存取款一体机?我抑郁。
于是冒着大学来到大运村招行,插卡,输密码,这 ATM 机漏电!每输一个数字被电一下,我被电 n 下后终于把钱存好了,出门,突然想再存 100,有前车之鉴,准备换一个 ATM 机,不料这个 ATM 机的触摸屏极其难用,废了九牛二虎之类终于存上了 100 块钱……
回去的路上准备买个包子吃,然后人家说卖完了……
希望现在把霉运都用完吧……开学了,加油!
Tags:
life
Related Posts
Posted in life
|
Tagged life
|
我也在国内呆烦了,虽然没有国内主机,但是域名放在国内还是有点……于是搬出去了。
先来看此人的悲惨经历:http://blog.s135.com/domain_transfer/ (仅供对照用……)
我以为代理商得捞一笔钱吧,不捞钱的话起码也得让你寄点材料啥的,比如申请表啦,身份证复印件啦,然后就是等邮政的速度……(上面链接里用快递公司寄过去是否违反邮政专营的规定?)然后等待代理商给你转移码,之后就简单了,GoDaddy 转入,5 天的等待就 OK 了。
没想到这个代理商出奇的有良,我问:“新网域名转出需要啥手续?”他说不需要手续,然后问我域名和邮箱,之后转移码就出现在我的邮箱里了……我顿时就震惊了……瞬间转入 GoDaddy,等待 5 天,生效了……
现在查 whois 就已经是 GoDaddy 下面的了。
强烈曝光下这有良的代理商:http://yikay.taobao.com/ (广告自重……)
有良的代理为我省了一年的域名费用,邮寄资料的费用和好多天的时间,thx。
PS: GoDaddy 的后台好像不支持 Chrome,我不是很喜欢它那个后台。
Tags:
domain,
GoDaddy,
xinnet
Related Posts