2010-07-30 38 views
9
public class MyClass 
{ 
    int i = 0; 
    string str = "here"; 
    MyStruct mystruct; 
    B b; 
    ArrayList myList = new ArrayList(10); 

    public MyClass() 
    { 
    } 
    .... 
} 

public struct MyStruct 
{ 
    public int i; 
    public float f; 
} 

public class B 
{ 
    ... 
} 

Muốn tìm hiểu cách thể hiện của một lớp được tạo trong nền. Khi tuyên bố nàyLàm thế nào để C# tạo một thể hiện của một lớp?

MyClass myClass = new MyClass(); 

được đánh giá. Điều gì sẽ xảy ra trong backgroud? Các câu sau của tôi là đúng hay không (đối với máy tính hệ điều hành 32 bit)?

  1. Không gian bộ nhớ sẽ được tạo và tham chiếu là myClass;
  2. trong không gian bộ nhớ trên, 4 byte được sử dụng cho giá trị int i;
  3. trong không gian bộ nhớ trên, 4 byte được sử dụng để tham chiếu string str; giá trị thực tế của str được lưu ở vị trí khác (ở đâu?)
  4. trong không gian bộ nhớ trên, 8 byte được sử dụng cho giá trị MyStruct mystruct (vì MyStruct là 8 byte);
  5. trong không gian bộ nhớ trên, 4 byte được sử dụng để tham chiếu đối tượng B b; bộ nhớ cho đối tượng b sẽ được cấp phát ở một nơi khác khi nó được khởi tạo;
  6. trong không gian bộ nhớ trên, 4 byte được sử dụng để tham chiếu đến ArrayList myList; không gian bộ nhớ thực tế cho ArrayList myList được phân bổ ở nơi khác và được tham chiếu tại đây là myList;
  7. một 4 hoặc 8 byte khác từ không gian bộ nhớ trên được sử dụng cho siêu dữ liệu đối tượng;
  8. ...;

Trả lời

2

Bạn có ý tưởng cơ bản tại chỗ. Các chi tiết cụ thể thực tế của điều này, ngoài những gì bạn đưa vào, là thực hiện cụ thể. Tuy nhiên, đối với một vài điểm của bạn:

3) Chuỗi thực tế thường được lưu trữ trong không gian bộ nhớ riêng của nó, giống như bất kỳ lớp nào khác. Tuy nhiên, kể từ khi bạn đang sử dụng một chuỗi chữ trong trường hợp này, nó sẽ rất có thể là trong chuỗi intern intern, đó là (tôi tin) được lưu trữ trong đống đối tượng lớn. Để biết chi tiết về việc thực hiện chuỗi, hãy xem String.Intern. (Nếu bạn đã phân bổ chuỗi khi đang di chuyển, thay vì sử dụng chữ, chuỗi sẽ được lưu trữ trong vùng ứng dụng của bạn được quản lý bình thường.)

1

Về điều đó.

Chuỗi được lưu trữ trong bảng chuỗi chứ không phải là đối tượng thả nổi miễn phí trong heap. Điều quan trọng cần lưu ý là chỉ có một thể hiện của chuỗi đó được khởi tạo, bất kể số lượng cá thể của MyClass được khởi tạo.

1

7.khác 4 hoặc 8 byte từ bộ nhớ trên được sử dụng cho đối tượng siêu dữ liệu

Nó sẽ là 8 byte. 4 cho syncblock và 4 cho thông tin loại.

Bạn có thể tìm thêm thông tin về chủ thể trong số question này.

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