作者回复: 我在32讲,重点讲了编译器和垃圾回收的关系。 总的来说,垃圾回收属于运行时机制。但垃圾回收机制的运行,需要编译器的支持。比如,在合适的时候(安全点)停下程序的运行,去垃圾回收机制去运行,这就需要编译器生成这样的代码,去和gc做协调。 另外,通常,编译器还要告诉gc,gc root(包括全局变量、本地变量、存放在寄存器中的变量等)都是哪些,便于垃圾收集机制的运行。 为了配合一些特定的垃圾收集算法,编译器还要插入一些其他的代码,比如读写屏障。 对于采用引用计数方法的gc,就更需要编译器的配合。编译器要插入相应的代码(机器码),增减引用计数。在引用计数为零的时候,还要调用回收内存的代码。
作者回复: 看看这篇文档对你有没有用:https://clang.llvm.org/docs/CrossCompilation.html 我的习惯,是在本机自行编译一下LLVM,里面也带了clang等工程。这有几个好处: 首先,可以拥有一个debug版本的LLVM,方便用一些针对开发者的工具和参数。 第二,可以选择合适的LLVM/Clang版本。 第三,可以不依赖本机原来带的clang,所有的配置,包括头文件什么的,都用自己的这一套。
作者回复: -O1、-O2什么的,代表不同的优化深度。优化越多,编译时间越长。 你可以对比一下-O1和-O2生成的汇编代码的不同,可以加深理解。