您的位置:首页 > 编程语言

读书笔记:《游戏之旅——我的编程感悟》

2013-08-16 09:18 127 查看
这本书以前看过一遍,但那时候技术很菜,看了也没记住多少东西。现在回头再看一遍。将其中我感兴趣,有体会的点记录一下。

一 编译器对常用函数的优化
第四章 前windows时代 第82页说:用一个for循环去复制一块内存,就永远比memcp要慢,因为memcpy是编写crt库的人手工写出的为CPU特别优化的汇编代码。

分析了一下vs2010中的memcpy.asm(一般路径为C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\crt\src\INTEL\memcpy.asm)。memcpy.asm中的memcpy会考虑内存覆盖的问题,也就是灵活切换时memcpy还是memmove。

memcpy.asm中采用了以下优化方式:
1 如果编译选项中有sse2选项,则使用sse2指令集来做字符串拷贝操作。
2 如果目标位置没有内存对齐到4字节处,则先进行逐字节的拷贝,使目标位置对齐到4字节位置。
3 拷贝长度大于32字节时,先用rep movsd指令进行逐个dword拷贝。
4 拷贝长度小于32字节时,直接使用跳转表进行逐个dword拷贝。
5 对于最后不足4字节的长度,使用跳转表进行逐byte的拷贝。 

二 A*算法
已经写在上一篇文章中了。

三 汇编指令
push fs  虽然fs是16位的,但是push fs 时, esp会减4。

push ax  ax是16位的,且push ax 时, esp 减少2。

push al  是不合法的指令。

bswap 指令,可以逆转一个32位寄存器的4个字节。

四 UV流水线
Pentium指令被分为4类
第一类:可以共组在任一流水线上,且任何情况下都运行另一条流水线并行工作。
例如mov,nop,push,pop,lea,inc,dec,add,sub,cmp,and,or,xor这些指令。
第二类:指令虽然可以在UV任一条流水线中工作,但只有在U流水线中工作时,V流水线尅被别的指令占用。反之,如果它工作在V流水线中,U流水线被暂停工作。
例如adc,sbb指令。
第三类:和前一种相反,在V流水线工作时,才能和U流水线协同工作,反之则只能单独处理。
例如call,jmp,条件跳转指令。
第四类:指令只能工作在U流水线内,且同时V流水线一定是闲置的。(不被推荐使用)

问题:哪一条指令在U流水线运行,哪一条指令在V流水线运行呢?
跳转指令只能在V流水线才能和U流水线协同,反之如果跳转指令在U流水线则V流水线暂停。
跳转到的地方,U,V两条流水线都是可工作的状态。

简单的指令应该放在U流水线去做。

五 C++
判断一个C++程序是否是由有经验的C++程序员写出来,最简单的方法就是看代码中const出现的频率。
介绍书籍:《C++编程思想》《C++的发展与演化》

六 遗传算法
打算用俄罗斯方块中确定AI权值的过程来实践一下遗传算法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: