Tôi không thể nói chính xác thuật toán nào được sử dụng bởi bất kỳ triển khai cụ thể nào, nhưng tôi có thể đưa ra một số phỏng đoán có học thức. Một Trie là một cấu trúc dữ liệu rất hữu ích cho vấn đề này: IDE có thể duy trì một Trie lớn trong bộ nhớ của tất cả các biểu tượng trong dự án của bạn, với một số siêu dữ liệu thêm tại mỗi nút.
Khi bạn nhập một ký tự, nó sẽ đi xuống một đường dẫn trong trie. Tất cả các con cháu của một nút trie cụ thể đều có thể hoàn thành. Sau đó, IDE chỉ cần lọc những cái đó theo những cái có ý nghĩa trong ngữ cảnh hiện tại, nhưng nó chỉ cần tính càng nhiều càng tốt có thể được hiển thị trong cửa sổ bật lên hoàn thành tab.
Hoàn thành tab nâng cao hơn yêu cầu một bộ ba phức tạp hơn. Ví dụ, Visual Assist X có một tính năng theo đó bạn chỉ cần nhập các chữ cái in hoa của các ký hiệu CamelCase - ví dụ: nếu bạn nhập SFN, nó sẽ hiển thị cho bạn ký hiệu SomeFunctionName
trong cửa sổ hoàn thành tab của nó.
Việc tính toán trie (hoặc các cấu trúc dữ liệu khác) yêu cầu phải phân tích cú pháp tất cả mã của bạn để có được danh sách tất cả các ký hiệu trong dự án của bạn. Visual Studio .ncb
lưu trữ tệp này trong cơ sở dữ liệu IntelliSense của nó, một tệp được lưu trữ cùng với dự án của bạn, để nó không phải phân tích lại mọi thứ mỗi khi bạn đóng và mở lại dự án của mình. Lần đầu tiên bạn mở một dự án lớn (giả sử bạn vừa đồng bộ hóa điều khiển nguồn biểu mẫu), VS sẽ dành thời gian để phân tích cú pháp mọi thứ và tạo cơ sở dữ liệu.
Tôi không biết cách nó xử lý các thay đổi gia tăng. Như bạn đã nói, khi bạn đang viết mã, nó là cú pháp không hợp lệ trong 90% thời gian và việc viết lại mọi thứ bất cứ khi nào bạn chạy không tải sẽ đặt một khoản thuế lớn lên CPU của bạn vì rất ít lợi ích, đặc biệt nếu bạn đang sửa đổi tệp tiêu đề được một số lượng lớn các tệp nguồn.
Tôi nghi ngờ rằng nó (a) chỉ trả lời bất cứ khi nào bạn thực sự xây dựng dự án của mình (hoặc có thể khi bạn đóng / mở nó) hoặc (b) nó thực hiện một số loại phân tích cục bộ nơi nó chỉ phân tích mã xung quanh nơi bạn vừa được chỉnh sửa theo một số kiểu giới hạn, chỉ để lấy tên của các biểu tượng có liên quan. Vì C ++ có một ngữ pháp phức tạp vượt trội, nó có thể hoạt động kỳ lạ trong góc tối nếu bạn đang sử dụng lập trình siêu mẫu nặng và những thứ tương tự.