字符匹配算法

  • 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
2
3
-sat-dump 输出AST
-L/usr/bin/libclang.so 连接某某库
-std=c++11 使用c++11标准

文本处理(\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
2
3
https://www.gnu.org/software/make/manual/make.html#Automatic-Variables
https://www.gnu.org/software/make/manual/make.html#Implicit-Variables
https://www.gnu.org/software/make/manual/make.html#Pattern-Examples

写Makefile最好别有bug,要不然你会发现改完bug结果程序还是很奇怪,就是因为你的dependency没写对,所以最后文件没有及时被更新。

关于value_type

value_type 就是个用来generic编程的工具而已,即指定数据类型。

在类里用typedef double value_type,用typeof不会发生变化

在C++里最好不要用 typeof,要用 decltype,因为 typeof 是C,decltype 对template是有效的