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

时间:2022-06-01 19:03:43

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


一 编译器对常用函数的优化第四章 前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权值的过程来实践一下遗传算法。