2009-04-18 7 views
13

Eclipse CDT fornisce due indicizzatori per il codice C/C++ (Preferenze> C/C++> Indicizzatore). Qualcuno sa qual è la differenza esatta tra questi due?Eclipse ha due indici C/C++ (veloce e completo): qual è la differenza?

Il file di aiuto non è esattamente illuminante:

"CDT supporta il contributo di indicizzatori supplementari, con 2 indicizzatori viene fornito con il default CDT rilascio:

  • veloce Indicizzatore C/C++: fornisce funzionalità di indicizzazione più rapide - sia dichiarazioni e informazioni di riferimento incrociato . Questo è il consigliato. indicizzatore.

  • completa C/C++ indicizzatore: fornisce ancora più accurata indicizzazione capacità a costo di prestazioni - sia le dichiarazioni e informazioni di riferimento incrociato "

Che cosa significa essere più. accurato: indicizza più cose, e in tal caso quali?

+1

È ancora il caso, in Eclipse Kepler, di essere disponibili due indicizzatori? Non vedo due ... forse uno è stato rimosso? – einpoklum

risposta

13

Questo è un estratto dalla pagina CDT che descrive la loro analisi e indicizzazione (CDT/designs/Overview of Parsing). Dà una buona descrizione di ciò che le differenze sono e dove l'indicizzatore veloce può fallire:

l'analisi e la risoluzione vincolante è un processo lento , questo è un problema perché l'utente si aspetta modifica del codice caratteristiche come l'assistenza ai contenuti è veloce. Per questo motivo CDT memorizza le informazioni di associazione in una cache su disco denominata "l'indice" o "PDOM" (modello oggetto documento persistente) nell'ordine per poter fornire le funzionalità che rispondono rapidamente alle richieste dell'utente.

Costruire l'indice coinvolge l'analisi tutto il codice in un progetto, risolvendo tutte le associazioni e la scrittura di quelle associazioni per l'indice. L'indice è quindi aggiornato in modo incrementale ogni volta l'utente modifica un file.

versioni precedenti di sostegno CDT tre modalità di indicizzazione diverse, veloce indicizzazione, piena di indicizzazione e nessun indicizzazione. L'impostazione predefinita è l'indicizzatore veloce perché l'indicizzazione di un grande progetto può richiedere tempo un processo . La differenza tra i indicizzatori veloce e pieno è che il veloce indicizzatore salterà file header già analizzato una volta, mentre l'indicizzatore completo sarà sempre ri-analizzare un file di intestazione ogni volta che è incluso. Tuttavia è importante capire che l'indicizzatore completo, nonostante il suo nome, non è ancora completo preciso.

Quando un file di intestazione è incluso in un file di fonte che è soggetto ad alcuna macro che sono stati definiti a quel punto . Alcune intestazioni di libreria utilizzano le macro in combinazione con le condizioni condizionali del preprocessore (#ifdefs) per includere parzialmente un file di intestazione nello . A volte tale un file di intestazione è incluso più di una volta in un progetto, se le macro che l'intestazione dipende sono diverse ogni volta che l'intestazione è incluso poi diverse parti del colpo di testa possono essere inclusi in diversi file di origine. Nessun indicizzatore sarà accurato in questo scenario perché sarà solo indicizzare l'intestazione la prima volta che si incontra .

L'indicizzatore completo riprodurrà nuovamente le intestazioni che ha già rilevato, ma lo non le indicherà nuovamente. Pertanto, i file di origine che includono un'intestazione possono essere analizzati in modo più preciso, ma l'intestazione stessa verrà indicizzata solo per la volta . L'indicizzatore completo è molto più più veloce dell'indicizzatore veloce perché dell'analisi aggiuntiva, ma lo è solo marginalmente più accurato. Per questo motivo l'indicizzatore completo non è raccomandato ed è stato rimosso da la versione corrente di CDT.

Ad ogni progetto è associato un singolo PDOM . Il PDOM è memorizzato su disco come un file binario piatto. L'indicizzatore indicizzerà solo le intestazioni che sono incluse dai file di origine, quindi se nel progetto è presente un file .h non è incluso alcun file .c o .cpp, quindi normalmente non verrà visualizzato indicizzato. Tuttavia, è disponibile l'impostazione per l'indicizzazione di tutti i file nel progetto .

+6

Ho scritto quella voce della pagina Wiki, e rileggendola qui ho capito che era sbagliato. L'indicizzatore completo non è in realtà completamente accurato ed è stato rimosso dalla versione corrente di CDT. Ho aggiornato il wiki e questa risposta è corretta (e ho ricontrollato con altri sviluppatori CDT per assicurarmi che sia corretta). –

+1

@MikeKucera tutti quelli che conosco che usano eclipse usano una vecchia versione in modo che possano ottenere l'indicizzatore completo, sai se tornerà mai alle versioni correnti? –

+0

Non chiamiamo più l'indicizzatore rimanente l'indicizzatore 'veloce', poiché da anni esiste un solo indicizzatore, abbiamo appena iniziato a chiamarlo 'l'indicizzatore'. Ultimamente ha ottenuto molti miglioramenti di precisione e velocità. Ad esempio, l'indicizzatore ora indicizzerà un file di intestazione più volte se è incluso più di una volta in diversi contesti (ovvero insiemi diversi di macro significative). Ciò ti riporta indietro alla precisione che il vecchio indicizzatore completo aveva senza l'enorme penalizzazione delle prestazioni. Consiglio vivamente a te e ai tuoi amici di eseguire l'aggiornamento all'ultima versione di CDT. –

1

Credo che ritorni sempre a tutti i file trovati/inclusi senza "cache". motivo se il contenuto dei file potrebbe dipendere dalle definizioni del preprocessore, in modo che venga sempre ripetuto. Il parser veloce presume che nulla sia cambiato da quando il file è stato incontrato per la prima volta.

(ma potrei sbagliarmi)

1

Qualcuno sa che cosa è la differenza esatta tra i due?

Nella mia esperienza, circa 32 MB di heap.

Problemi correlati