Je ne peux pas dire exactement quels algorithmes sont utilisés par un particulier mise en œuvre, mais je peux faire des suppositions éclairées. Un trie est très utile structure de données pour résoudre ce problème: l'IDE peut maintenir un grand trie dans la mémoire de tous les symboles de votre projet, avec certains de métadonnées supplémentaires à chaque nœud.
Lorsque vous tapez un caractère, il se promène sur un chemin dans le trie. Tous les descendants d'un trie de nœud sont complétions possibles. L'IDE suffit alors de filtre par ceux qui ont un sens dans le contexte actuel, mais il suffit de calculer autant que peut être affichée dans l'onglet de l'achèvement de la fenêtre pop-up.
Plus d'onglet avancé-l'achèvement requiert une plus compliqué trie. Par exemple, Visual Assist X dispose d'une fonction par laquelle vous avez seulement besoin de taper les majuscules CamelCase symboles -- par exemple, si vous tapez SFN, il vous montre le symbole SomeFunctionName
dans son onglet de l'achèvement de la fenêtre.
Le calcul de la trie (ou d'autres structures de données) nécessite l'analyse l'ensemble de votre code pour obtenir une liste de tous les symboles de votre projet. Visual Studio enregistre dans ses IntelliSense de base de données, un .ncb
fichier stocké le long de votre projet, de sorte qu'il n'a pas à l'analyse de tout, à chaque fois que vous fermez et rouvrez votre projet. La première fois que vous ouvrez un projet de grande envergure (par exemple, celui que vous venez de synchronisés forme de contrôle de la source), contre la volonté de prendre le temps d'analyser tout et de générer la base de données.
Je ne sais pas comment il gère les modifications incrémentielles. Comme vous l'avez dit, lorsque vous écrivez du code, c'est de la syntaxe invalide à 90% du temps, et ré-tout quand vous le ralenti entraînerait un énorme de l'impôt sur votre CPU pour très peu d'avantages, surtout si vous êtes à la modification d'un fichier d'en-tête inclus par un grand nombre de fichiers source.
Je soupçonne qu'il soit (un) seulement reparses chaque fois que vous construisez votre projet (ou peut-être quand vous fermer/ouvrir), ou (b) il fait un peu de tri des locaux de l'analyse où il ne traite le code autour de l'endroit où vous avez juste édité dans certains limité de la mode, juste pour obtenir les noms des symboles pertinents. Depuis C++ a une telle extraordinairement compliqué de grammaire, il peut se comporter bizarrement dans les coins sombres si vous êtes en utilisant un gros modèle de la métaprogrammation et la comme.