13

Eclipse CDT は、C/C++ コード用に 2 つのインデクサーを提供します ([設定] > [C/C++] > [インデクサー])。これら2つの正確な違いを知っている人はいますか?

ヘルプ ファイルは正確には啓発的ではありません。

「CDT は追加のインデクサーの貢献をサポートしており、デフォルトの CDT リリースでは 2 つのインデクサーが提供されています。

  • Fast C/C++ Indexer : 最速のインデックス作成機能 (宣言と相互参照情報の両方) を提供します。これは推奨されるインデクサーです。

  • 完全な C/C++ インデクサー: 宣言と相互参照情報の両方のパフォーマンスを犠牲にして、さらに正確なインデックス作成機能を提供します。"

より正確であるとはどういう意味ですか: より多くのものをインデックス化しますか? もしそうなら、どれをインデックス化しますか?

4

3 に答える 3

14

以下は、解析と索引付けについて説明している CDT ページからの抜粋です ( CDT/designs/Overview of Parsing )。違いが何であり、高速インデクサーが失敗する可能性がある場所についてのかなり良い説明を提供します。

解析とバインドの解決は遅いプロセスです。ユーザーはコンテンツ アシストなどのコード編集機能が高速であることを期待しているため、これは問題です。このため、CDT はバインディング情報を「インデックス」または「PDOM」(Persisted Document Object Model) と呼ばれるディスク上のキャッシュに保存し、ユーザーの要求にすばやく応答する機能を提供できるようにします。

インデックスの構築には、プロジェクト内のすべてのコードの解析、すべてのバインディングの解決、それらのバインディングのインデックスへの書き込みが含まれます。その後、ユーザーがファイルを編集するたびに、インデックスが増分的に更新されます。

古いバージョンの CDT では、高速インデックス作成、完全インデックス作成、およびインデックス作成なしの 3 つの異なるインデックス作成モードがサポートされています。大規模なプロジェクトのインデックス作成は時間のかかるプロセスになる可能性があるため、既定の設定は高速インデクサーです。高速インデクサーと完全インデクサーの違いは、高速インデクサーは既に一度解析されたヘッダー ファイルをスキップするのに対し、完全インデクサーはヘッダー ファイルが含まれるたびに常に再解析することです。ただし、完全なインデクサーは、その名前にもかかわらず、まだ完全に正確ではないことを理解することが重要です。

ヘッダー ファイルがソース ファイルにインクルードされると、その時点で定義されているすべてのマクロが適用されます。一部のライブラリ ヘッダーは、ヘッダー ファイルを部分的にインクルードするために、プリプロセッサ条件 (#ifdefs) と組み合わせてマクロを使用します。このようなヘッダー ファイルがプロジェクトに複数回インクルードされることがあります。ヘッダーが依存するマクロが、ヘッダーがインクルードされるたびに異なる場合、ヘッダーのさまざまな部分がさまざまなソース ファイルにインクルードされる可能性があります。このシナリオでは、どちらのインデクサーも正確ではありません。これは、ヘッダーが最初に検出されたときにのみインデックスを作成するためです。

フル インデクサーは、既に検出されたヘッダーを再解析しますが、再インデックスは行いません。したがって、ヘッダーを含むソース ファイルはより正確に解析される可能性がありますが、ヘッダー自体は 1 回だけインデックス化されます。完全なインデクサーは、余分な解析が行われるため、高速インデクサーよりもはるかに遅くなりますが、わずかに正確になるだけです。このため、フル インデクサーは推奨されておらず、現在のバージョンの CDT から削除されています。

各プロジェクトには、関連付けられた 1 つの PDOM があります。PDOM はフラット バイナリ ファイルとしてディスクに保存されます。インデクサーは、ソース ファイルに含まれるヘッダーのみをインデックス付けするため、.c または .cpp ファイルに含まれていない .h ファイルがプロジェクトにある場合、通常はインデックス付けされません。ただし、プロジェクト内のすべてのファイルをインデックス化するための設定があります。

于 2009-04-21T22:23:23.613 に答える
1

これら2つの正確な違いを知っている人はいますか?

私の経験では、約32MBのヒープです。

于 2009-04-20T00:44:57.130 に答える
1

「キャッシュ」なしで、見つかった/含まれているファイルを常に再解析すると思います。ファイルの内容がプリプロセッサの定義に依存する可能性があるため、常に再解析される理由。高速パーサーは、ファイルが最初に検出されてから何も変更されていないと想定します。

(しかし、私は間違っている可能性があります)

于 2009-04-18T18:01:52.567 に答える