tools内容比较多,但是分值得记录的比较少,目前看来只有说ibm的purify和quantify是不错的工具,可能的话,项目里面可以使用以下。
3,fundamentals of software engineering for games
3.1 c++
重申个原则就是一般来说组合由于继承。
design pattern是好东西,但是需要好好理解,恰到好处的用----不用听没有充分理解的喷子的话。
像singleton,iterator这些,战斗力刚刚的,该用就用。
3.2 data code and memory
这部分float是个很好的复习,也对编程很有帮助,历史上也在float上犯过错误,也见到别人犯错误:
float = s*pow(2, e-127)*(1+m)
s---符号,最左边的1位
e---接下来8位
mantissa----最右边剩下的23位
float最大大约表示到3×pow(10,28),最小(绝对值)比较关键是pow(2,-126),这个也可以叫machine epsilon,是大于0的最小的positive的float值。
一些compiler specific types
有一些是compiler指定的类型,也在游戏中常常用到,实际上我个人也是更喜欢这种:
像vs compiler用的_int8, _int16这种
simd types:
会有类似_m128这样的类型。
3.2.3 c++ memory layout
这一块给力!
1st executable image
这一块在内存中的分布,会分成这么几种:
- text(code) segment----放machine code
- data segment----有被初始化的global variable(包括static)
- bss segment----没被初始化的global variable放在bss segment,因为默认值是0,所以统一隔离出来作为一种优化,所以不必要的话就不要初始化global variable了,还可以省点内存
- read only segment----const的东西(包括基本类型像const float或者class instance const blan a; )放在这里,但是const int除外,这个是直接放在code里的
2nd program stack
调用新函数的时候会做这样的事情:
- 保留return address
- backup register value,这样新函数也可以用这些备份过的register了
3rd packing
编译器会给成员加一些pack位来提高cache和cpu读取效率。
pack的基本原则就是class里面的member和其本身都会align到其自己大小,一些例子,做面试题挺好的:
class pad{char a};---1byte
class pad{char a; int b;}----8byte
class pad{int a; char b;}----8byte
class pad{double a; char b;} -----16byte
class pad{double a; int b; } 16byte
也就是说对类内部数据的重新排列有可能会降低内存消耗,很有用的知识点。
4th class的内存
virtual table ptr
dad class
kid class
这样一个排列。
原文链接: