2012-10-27 42 views
9

thể trùng lặp:
Understanding the vtable entriesGiải thích về bảng ảo

Sử dụng g ++ phiên bản 4.6.3, máy 64-bit. Tôi biết trình biên dịch là miễn phí để thực hiện các chức năng ảo bất kỳ cách nào nó muốn. Tôi muốn biết chuyện gì đã xảy ra ở đây.

lớp của tôi:

#include <iostream> 
class test 
{ 
    public: 
    virtual void func(){std::cout<<"in class test";} 
}; 

int main() 
{ 
    test obj; 
    obj.func(); 
    return 0; 
} 

Nhìn vào bảng ảo được tạo ra bởi trình biên dịch,

Vtable for test 
test::_ZTV4test: 3u entries 
0  (int (*)(...))0 (<---- what is this?) 
8  (int (*)(...))(& _ZTI4test) 
16 (int (*)(...))test::func 

Tại bù đắp 8 nó là RTTI

Tại bù đắp 16 nó là mục nhập cho chức năng ảo.

Câu hỏi của tôi là tại sao có mục nhập cho NULL tại offset 0 hoặc nói cách khác mục đích của mục nhập đầu tiên là gì?

P.S. Tôi nghĩ rằng điều này có thể liên quan đến căn chỉnh, nhưng sau đó tôi đã thêm nhiều chức năng ảo nhưng mục nhập RTTI vẫn được bù đắp 8.

+0

Tôi đoán là nó được dành riêng cho trình hủy (mà bạn không thêm). – john

+0

@John, thêm destructor vẫn còn sản lượng tương tự. Ngoài ra, là destructor cần thiết sẽ luôn luôn là một phần của v-table? – Anon

+0

Nó rất phổ biến để có một destructor ảo nếu bạn có bất kỳ chức năng ảo. Nhưng nó không bắt buộc. Oh well đoán của tôi đã sai. – john

Trả lời

8

Tôi tin mục nhập đầu tiên hoặc mục nhập là 0 là giá trị bù cho con trỏ trên cùng.

Xem the following relevant stackoverflow question

Nhìn qua phần còn lại -fdump-đẳng cấp thứ bậc từ mã nguồn của bạn, hầu hết các lớp học dường như đều có sự xâm nhập đầu tiên như (int (*)(...))0, các lớp học duy nhất mà không có nó như mục đầu tiên có nó như là thứ hai và có mục đầu tiên như là bù đắp cho lớp cha mẹ cho hệ thống phân cấp lớp C++ STL cho các luồng.

Trong câu hỏi có liên quan một liên kết chết để một số ví dụ vtable được đưa ra, tôi tin rằng một phiên bản sống của liên kết mà có sẵn here

Một nguồn tài nguyên hữu ích quy định chi tiết cấu trúc của vtables là here.

+0

Hoàn hảo. Cảm ơn. – Anon

+0

Đúng. Đó là con trỏ "offset to top". Trong số những thứ khác, điều này được sử dụng để thực hiện 'dynamic_cast '. Diễn viên đó đưa ra một con trỏ tới đối tượng có nguồn gốc nhiều nhất. Tiêu chuẩn của khóa học không nói bất cứ điều gì về vtables, hoặc về cách thực hiện sẽ đi về làm cho 'dynamic_cast ' chức năng theo yêu cầu. –