姐姐的启示录1
字符匹配算法
- KMP
- Boyer–Moore string search algorithm(最快的:用于在grep和记事本查找,ripgrep)
- Aho–Corasick algorithm(同时查找)
编译器相关
编译器最难的两个地方是后端和优化, 后端需要做register allocation
编译器的前端到优化有个过程叫做canonization,就是把等效control flow变成一个格式。LLVM只优化if xxx == xxx,!=全都转化成了==
因为指令和数据一样有个cache,L1的cache一半数据一半指令,这就是为什么-O3可能会更慢。
编译器有个优化叫做__buildin_expect,告诉编译器这个if是true可能性大还是false可能性大,然后编译器就会把可能性大的branch的指令放到一起,其实在loop很重要。在汇编中没有jmp时,指令一直在线性运动,对于小计算来说更加快。
clang参数
1 | -sat-dump 输出AST |
文本处理(\r)
把,变成起新的一行是:%s/,/\r/g
用\n会把相应位置变成了一个不可见字符,因为Vim太老了
\r是回到本行第一个字符
2D array
应当写函数类似linearindex(int* A, size_t N, size_t M)
来访问数组
C正常的2D array指向pointer
**
的第一个*
指向pointer array
所以*(*A+3)+2
就是A[3][2]
makefile文件
1 | https://www.gnu.org/software/make/manual/make.html#Automatic-Variables |
写Makefile最好别有bug,要不然你会发现改完bug结果程序还是很奇怪,就是因为你的dependency没写对,所以最后文件没有及时被更新。
关于value_type
value_type
就是个用来generic编程的工具而已,即指定数据类型。
在类里用typedef double value_type
,用typeof
不会发生变化
在C++里最好不要用 typeof
,要用 decltype
,因为 typeof
是C,decltype
对template是有效的