2011-07-12 34 views
5

Vftable trong ngôn ngữ lập trình cao là gì?vftable - đây là gì?

Tôi đọc một cái gì đó giống như đó là địa chỉ của một cấu trúc đối tượng ảo, nhưng đây là một thông tin khá lộn xộn

Ai đó có thể xin giải thích nó?

+0

Bạn có nghĩa là một ngôn ngữ đặc biệt? –

+3

Có một [bài viết trên Wikipedia] (http://en.wikipedia.org/wiki/Vtable), bạn đã đọc nó chưa? –

Trả lời

6

Rất có thể là viết tắt của "Virtual Function Table" và là cơ chế được một số triển khai thời gian chạy được sử dụng để cho phép virtual function dispatch.

Triển khai dòng C++ chính (GCC, Clang, MSVS) gọi nó là vtable. C không có đa hình. Tôi chỉ có thể suy đoán về các ngôn ngữ khác.


Đây là những gì Wikipedia nói về chủ đề này:

bảng công văn của một đối tượng sẽ chứa địa chỉ của phương pháp tự động ràng buộc của đối tượng. Các cuộc gọi phương thức được thực hiện bằng cách tìm nạp địa chỉ của phương thức từ bảng công văn của đối tượng. Bảng công văn giống nhau đối với tất cả các đối tượng thuộc cùng một lớp, và là do đó thường được chia sẻ giữa chúng. Các đối tượng thuộc các lớp tương thích loại (ví dụ anh chị em trong hệ thống thừa kế ) sẽ có bảng điều phối với cùng bố cục: địa chỉ của phương thức đã cho sẽ xuất hiện ở cùng mức bù cho tất cả các lớp tương thích loại . Do đó, tìm nạp địa chỉ của phương thức từ một số bù trừ của bảng công văn sẽ nhận được phương thức tương ứng với lớp thực tế của đối tượng . [1]

tiêu chuẩn C++ mà không cử chính xác cách thức cử động phải thực hiện, nhưng trình biên dịch thường sử dụng thay đổi nhỏ trên cùng một mô hình cơ bản .

Thông thường, trình biên dịch tạo một vtable riêng biệt cho mỗi lớp. Khi một đối tượng được tạo, con trỏ đến vtable này, được gọi là con trỏ bảng, vpointer hoặc VPTR ảo , được thêm làm thành viên ẩn của đối tượng này (trở thành thành viên đầu tiên trừ khi nó được thực hiện lần cuối [2]) . Trình biên dịch cũng tạo ra mã "ẩn" trong hàm dựng của mỗi lớp để khởi tạo các điểm đánh dấu của các đối tượng của nó đến địa chỉ của vtable tương ứng. Lưu ý rằng vị trí của vpointer trong cá thể đối tượng không phải là tiêu chuẩn trong số tất cả các trình biên dịch và dựa trên vị trí có thể dẫn đến mã không thể chuyển đổi. Ví dụ: g ++ trước đó đã đặt vpointer ở cuối đối tượng. [3]

  1. Ellis & Stroustrup 1990, pp. 227-232
  2. Heading "Multiple Inheritance"
  3. CodeSourcery C++ ABI
+0

Bạn luôn có thể xây dựng một vtable mình trong C - những gì bạn có nghĩa là "C không có ngôn ngữ nguyên thủy cho đa hình" :-) –

+0

@Kerrek: Có; chúng ta đang nói về một "vftable" sẽ là "_in_ ngôn ngữ lập trình cao", tức là một phần của ngôn ngữ. :) –

2

Vftable không được đề cập một cách rõ ràng trong tiêu chuẩn C++, nhưng hầu hết (nếu không phải tất cả) triển khai sử dụng nó để thực hiện chức năng ảo.

Đối với mỗi lớp có chức năng ảo, trình biên dịch tạo ra một loạt các hàm poiners là các con trỏ tới phiên bản overriden cuối cùng của các hàm ảo của lớp đó. Sau đó, mỗi đối tượng có một con trỏ đến vtable của lớp động của nó.

Xem câu hỏi này và câu trả lời chấp nhận của nó để biết thêm minh họa

Virtual dispatch implementation details

+0

Nếu tôi có thể, tôi sẽ chia các điểm chấp nhận thành một nửa vì liên kết của bạn đã cung cấp cho tôi các thông tin hữu ích –

Các vấn đề liên quan