Một đối tượng chứa các mục nhập cho tất cả các trường của nó, cộng thêm không gian để giữ con trỏ vào bảng phương thức ảo. VMT không chỉ chứa các con trỏ phương thức ảo. Tôi giải thích more about the VMT tại trang web của tôi, bao gồm một sơ đồ.
Dường như, Delphi 2009 giới thiệu một trường ẩn khác ngoài con trỏ VMT để giữ màn hình đồng bộ hóa. Bạn có thể xác định xem nó được thêm vào ở đầu hoặc ở cuối của lớp với một số mã đơn giản:
type
TTest = class
FField: Integer;
end;
var
obj: TTest;
ObjAddr, FieldAddr: Cardinal;
begin
Assert(TTest.InstanceSize = 12);
obj := TTest.Create;
ObjAddr := Cardinal(obj);
FieldAddr := Cardinal(@(obj.FField));
writeln(FieldAddr - ObjAddr);
end.
Nếu nó in giá trị 4, sau đó lĩnh vực giám sát phải ở phần cuối của đối tượng vì 4 chỉ các tài khoản cho kích thước của con trỏ VMT. Nếu nó in giá trị 8, thì trường màn hình phải ở đầu, tiếp giáp với con trỏ VMT.
Tôi hy vọng bạn sẽ tìm thấy màn hình khi bắt đầu. Nếu không, nó có nghĩa là cách bố trí của đối tượng hậu duệ không chỉ đơn giản là bố trí của đối tượng cơ sở với tất cả các trường mới được nối thêm. Nó có nghĩa là bù đắp của trường giám sát phụ thuộc vào loại thời gian chạy của đối tượng và điều đó làm cho việc triển khai phức tạp hơn.
Khi một lớp thực hiện một giao diện, bố cục đối tượng bao gồm nhiều trường bị ẩn. Các trường chứa con trỏ tới giá trị tham chiếu giao diện của đối tượng. Khi bạn có một tham chiếu IUnknown
đối tượng, con trỏ nó giữ không giống như con trỏ đến trường VMT của đối tượng, đó là những gì bạn có với tham chiếu đối tượng thông thường. Giá trị con trỏ IUnknown
sẽ là địa chỉ của trường bị ẩn. Tôi đã viết more about the layout of classes that implement interfaces.
Nguồn
2009-03-24 21:00:30
Cũng giống như vậy. Tham chiếu TClass của lớp sẽ trỏ tới VMT của nó. Vì vậy, nó là cùng 4 byte. 4 cái còn lại là gì? –
(Điều đáng chú ý là cuốn sách đó được viết cách đây 9 năm.Có lẽ chỉ có một lĩnh vực ẩn trở lại sau đó. Bây giờ có vẻ là hai trong số họ.) –
Ngoài ra còn có một màn hình đồng bộ hóa trong D2009. Tôi sẽ cập nhật. –