như tôi hiểu, int là kiểu giá trị và do đó sống trong ngăn xếp
hiểu biết của bạn là không chính xác. Các loại giá trị được gọi là "loại giá trị" vì chúng được sao chép theo giá trị. Các loại tham chiếu được gọi là "loại tham chiếu" vì chúng được sao chép theo tham chiếu. Nó không phải là ở tất cả các sự thật rằng "loại giá trị luôn luôn sống trên ngăn xếp". Nếu điều đó đúng, chúng sẽ được gọi là "loại ngăn xếp" và "loại đống".
Sự thật là đây là chi tiết triển khai. Việc triển khai khung công tác khác nhau có thể chọn sử dụng ngăn xếp và vùng heap theo ý muốn. Dưới đây là cách triển khai của Microsoft thực hiện:
- giá trị của một loại tham chiếu là tham chiếu đến bộ nhớ heap. Tham chiếu về cơ bản là số nguyên 32 bit hoặc 64 bit.
- giá trị của một biến loại giá trị là giá trị của nó.
- giá trị của biến địa phương được lưu trữ trên ngăn xếp trừ khi biến cục bộ nằm trong khối lặp hoặc được đóng trên các biến bên ngoài của một phương thức ẩn danh hoặc biểu thức lambda. Trong những trường hợp đó, các giá trị của các biến cục bộ được lưu trữ trên heap. Trừ khi tất nhiên các biến địa phương có thể được tối ưu hóa đi, trong trường hợp đó không có lưu trữ nào cả. Hoặc có lẽ họ có thể được đăng ký, trong trường hợp đó họ không phải là trên stack hay heap, họ đang ở trong bộ xử lý đăng ký.
- giá trị của các biến mẫu của loại tham chiếu và biến tĩnh được lưu trữ trên heap.
Điều đó có rõ ràng không?
nó trỏ đến loại giá trị, nhưng không phải là tham chiếu này (trên heap)?
Trường "A" có loại giá trị. Nó là một trường, và do đó biến đó được lưu trữ trên heap.
trong khi tạo cá thể của Class1, các kiểu trường của nó cũng được tạo trên heap?
Bộ nhớ cho các biến mẫu là trên đống, có.
Nhưng sau đó tôi không hiểu khi nào nó thực sự ở trên ngăn xếp vì hầu như lúc nào bạn cũng cần phải tạo một thể hiện đối tượng để sử dụng các trường đó.
Nó sẽ không bao giờ ở trên ngăn xếp. Như tôi đã nói ở trên, những thứ duy nhất trên stack là các biến cục bộ (và các thời gian tạm thời do trình biên dịch tạo ra) mà không phải là các địa phương đóng của một lambda hoặc phương thức ẩn danh và không nằm trong khối lặp. Và tất nhiên, jitter là miễn phí để giữ chúng ra khỏi ngăn xếp hoàn toàn và đặt chúng trong sổ đăng ký nếu có đăng ký miễn phí.
Nhưng thực sự, tôi phải hỏi, tại sao bạn quan tâm những gì xảy ra trên ngăn xếp và những gì diễn ra trên heap? Những gì xảy ra trên stack là những thứ chúng ta có thể đặt giá rẻ trên stack; mọi thứ khác đi trên heap.
Nguồn
2010-04-02 15:05:35
Tên lớp không được phép bắt đầu bằng số – cpalmer
ngoài chủ đề: bạn có tên lớp không hợp lệ ở đó – thelost
cảm ơn, đã sửa :) – Mirek