Next: , Previous: Header Dirs, Up: Top


22 内存管理和类型信息

GCC使用了一些相当复杂微妙的内存管理技术,包括从GCC源代码中确定GCC的数据结构的信息,并使用该信息来执行垃圾收集和实现预编译头文件。

使用完整的C解析器来完成这项工作会非常复杂,因此只解析C的有限子集,并且使用特定的标记来确定源代码的哪些部分需要分析。所有的structunion声明,如果所定义的数据结构要在垃圾收集器的控制下进行分配,则必须被标记。所有的全局变量,如果所保存的指针是指向垃圾收集的内存,则也必须被标记。最后,所有的全局变量,如果需要通过预编译头文件来保存和恢复,则必须被标记。(预编译头文件机制只能保存标量,复杂的数据结构必须被分配在垃圾收集内存中,从而被保存在预编译头文件中。)

标记的完整格式是

     GTY (([option] [(param)], [option] [(param)] ...))

不过大多数情况下,不需要选项。虽然这样,外面的双括号依然是必须的:GTY(())。标记可以出现在:

这里有一些标记简单数据结构和全局变量的例子。

     struct tag GTY(())
     {
       fields...
     };
     
     typedef struct tag GTY(())
     {
       fields...
     } *typename;
     
     static GTY(()) struct tag *list;   /* points to GC memory */
     static GTY(()) int counter;        /* save counter in a PCH */

解析器能够理解简单的typedef,例如typedef struct tag *name;typedef int name;。这些不需要被标记。