2009-10-27 38 views
11

Bất cứ khi nào có đối tượng mới được tạo, đối tượng được tạo trên heap. Bộ nhớ được cấp phát cho từng đối tượng có hai trường bổ sung 1) Con trỏ đối tượng kiểu 2) chỉ mục khối đồng bộ.Đối tượng được phân bổ trên heap

Chính xác là việc sử dụng hai trường này. Ai có thể làm sáng tỏ điều này?

+0

Với tất cả các đối tượng thuộc loại thời gian cụ thể, thời gian chạy được cho là phải biết trừ khi nó ghi lại loại ở đâu đó ...? Đừng lo lắng về việc đọc loại nội dung đó, hãy lo lắng về mã của riêng bạn. –

+0

@mP Chính xác - vậy tại sao nó không ghi lại thông tin đó cho các loại giá trị? Nó luôn luôn có giá trị biết làm thế nào công cụ của bạn làm việc. – TarkaDaal

Trả lời

17

Con trỏ đối tượng kiểu được sử dụng để thể hiện loại đối tượng. Điều này là cần cho:

  • Phương pháp tra cứu (vtable)
  • Kiểm tra phôi
  • Tìm đối tượng Type nếu bạn gọi GetType.

Trường khóa đồng bộ hóa chủ yếu được sử dụng để khóa. Nó chỉ được lấp đầy khi nó cần, và khi một khóa luôn luôn là không bị cản trở, CLR làm với một khóa "mỏng" mà không yêu cầu bất kỳ dữ liệu bên ngoài. Nếu không, đó là một mục trong một bảng toàn bộ quá trình - Tôi không biết chi tiết về những gì trong bảng, nhưng tôi sẽ tưởng tượng nó giống như một danh sách các chủ đề đang chờ trên màn hình của đối tượng. Tất nhiên, bit quan trọng nhất của thông tin là liệu khóa hiện có được giữ hay không, theo đó luồng nào và số đếm của nó là gì (do tính chất reentrant của các khóa .NET).

Đồng bộ hóa cũng được điền vào nếu bạn gọi GetHashCode() và nó không bị ghi đè - nó sử dụng bảng quy trình để phân bổ số ổn định, về cơ bản. (Địa chỉ của đối tượng không đủ tốt vì nó có thể thay đổi theo thời gian.)

+0

Bạn không biết về GetHashCode và syncblock ... bạn có biết thêm thông tin về nó không? Tôi tìm thấy http://blogs.msdn.com/brada/archive/2003/09/30/50396.aspx này nhưng dường như chỉ có .NET 1.0/1.1 ... – thecoop

+1

@thecoop: Tôi không có bất kỳ khác tham chiếu đến bàn tay, mặc dù tôi mong đợi nó được đề cập trong CLR qua C#. –

+0

Tôi tin rằng syncblock cũng được sử dụng để lưu trữ siêu dữ liệu interop COM và một AppDomainID (như @JonSkeet đã nói, đó là một mục nhập trong bảng "_process-wide_"). – Sindhudweep

2

Chỉ mục khối đồng bộ được sử dụng dưới mui xe của lớp Monitor và do đó cũng có tuyên bố khóa.

1

Một số bit chỉ mục khối đồng bộ cũng được GC sử dụng để đánh dấu đối tượng là rác trong trường hợp nó không còn được tham chiếu.

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