Eclipse有两个C / C ++索引器(快速和完整):有什么区别?

Eclipse CDT为C / C ++代码提供了两个索引器(Preferences> C / C ++> Indexer)。 有谁知道这两者之间的确切区别是什么?

帮助文件并不完全具有启发性:

“CDT支持其他索引器的贡献,默认CDT版本提供了2个索引器:

  • 快速C / C ++索引器:提供最快的索引function – 声明和交叉引用信息。 这是推荐的索引器。

  • 完整的C / C ++索引器:以性能为代价提供更加准确的索引function – 包括声明和交叉引用信息。“

准确的是什么意思:它是否会为更多东西编制索引,如果是,那么哪些东西?

以下是CDT页面的摘录,描述了它们的解析和索引( CDT /设计/解析概述 )。 它很好地描述了差异是什么以及快速索引器可能失败的位置:

解析和绑定解析是一个缓慢的过程,这是一个问题,因为用户希望代码编辑function(如内容辅助)很快。 因此,CDT将绑定信息存储在称为“索引”或“PDOM”(持久文档对象模型)的磁盘缓存中,以便能够提供对用户请求快速响应的function。

构建索引涉及解析项目中的所有代码,解析所有绑定并将这些绑定写入索引。 每次用户编辑文件时,都会逐步更新索引。

较早版本的CDT支持三种不同的索引模式,快速索引,完整索引和无索引。 默认设置是快速索引器,因为索引大型项目可能是一个耗时的过程。 快速索引器和完整索引器之间的区别在于快速索引器将跳过已经解析过一次的头文件,而完整索引器将始终在每次包含头文件时重新解析头文件。 然而,重要的是要理解完整的索引器,尽管它的名字,仍然不完全准确。

当头文件包含在源文件中时,它受到在该点定义的任何宏的约束。 某些库头使用宏与预处理器条件(#ifdefs)一起部分包含头文件。 有时这样的头文件在项目中被包含多次,如果每次包含头时头的依赖的宏是不同的,则头的不同部分可以包括在不同的源文件中。 在这种情况下,索引器都不准确,因为它只会在第一次遇到标头时对其进行索引。

完整索引器将重新解析它已经遇到的标头,但它不会重新索引它们。 因此,可以更准确地解析包含标题的源文件,但标题本身将仅被索引一次。 完整索引器比快速索引器慢得多,因为它有额外的解析,但它只是稍微准确一点。 因此,建议不要使用完整索引器,并且已从当前版本的CDT中删除。

每个项目都有一个与之关联的PDOM。 PDOM作为平面二进制文件存储在磁盘上。 索引器将仅索引源文件包含的标头,因此如果项目中存在未包含在任何.c或.cpp文件中的.h文件,则通常不会对其进行索引。 但是,有一个首选项设置用于索引项目中的所有文件。

我相信它总是在没有“缓存”的情况下重新分析任何找到/包含的文件。 原因如果文件的内容可能依赖于预处理器定义,那么它总是被重新分析。 快速解析器假设自首次遇到文件以来没有任何更改。

(但我可能错了)

有谁知道这两者之间的确切区别是什么?

根据我的经验,大约32MB堆。