2010-08-20 41 views
9

Tôi tự hỏi liệu có một lệnh hoặc lệnh đơn giản trong C# /. NET và/hoặc Visual Studio có thể cho tôi biết bộ nhớ của một đối tượng là bao nhiêu tham gia? Tôi có một nghi ngờ lén lút rằng các nhà điều hành sizeof() sẽ nói dối với tôi ... Tôi có biện minh trong niềm tin này?Cách đo dung lượng bộ nhớ mà một đối tượng riêng lẻ có trong .NET

Có một câu hỏi nào liên quan here, nhưng không có câu trả lời dứt khoát được đưa ra về cách đo lường một đối tượng cá nhân

Trả lời

7

Không có cách nào dứt khoát vì nó không đơn giản chỉ bất kỳ loại đối tượng.

Điều gì sẽ xảy ra nếu đối tượng đó chứa tham chiếu đến các đối tượng khác? Điều gì nếu những đối tượng khác có các đối tượng khác tham chiếu đến chúng? Đối tượng nào thực sự sở hữu không gian bộ nhớ đó? Là người tạo ra nó hay người cuối cùng chạm vào nó? Tại một thời điểm, nó có thể có các chủ sở hữu khác nhau. Hay bạn chỉ quan tâm đến không gian tham chiếu mất bao nhiêu?

Ngoài ra còn có một tấn các câu hỏi đã hỏi này cũng ... một tìm kiếm nhanh lần lượt lên:

How to get object size in memory?

C#: Memory usage of an object

Find out the size of a .net object

How much memory does a C#/.NET object use?

và danh sách tiếp tục bật ...

+0

hoàn toàn đúng, nhờ con trỏ –

3

Không có cách nào dễ dàng và sizeof sẽ chỉ tốt cho các loại giá trị. Một đối tượng điển hình có chứa các tham chiếu đến các danh sách và các đối tượng khác, vì vậy bạn sẽ cần phải duyệt qua tất cả các con trỏ để có được số byte thực tế và thêm các kích thước con trỏ.

Bạn có thể xem API lược tả .Net hoặc sử dụng trình lược tả bộ nhớ như dotTrace. Một trình lược tả bộ nhớ sẽ giúp bạn biết được nơi bộ nhớ được cấp phát và nếu cấp phát bộ nhớ là một vấn đề trong ứng dụng của bạn. Điều này thường hữu ích hơn kích thước đối tượng thực tế.

1

Tôi tự hỏi làm thế nào System.Runtime.InteropServices.Marshal.SizeOf() hoạt động? Có rất nhiều hàm tĩnh thú vị trong đối tượng Marshal có thể hữu ích ở đây.

+3

Bánh đó cũng là lời nói dối. –

+0

Hấp dẫn ... Tôi sẽ dùng thử! –

3

Nếu bạn có thể - Tuần tự hóa!

Dim myObjectSize As Long 

Dim ms As New IO.MemoryStream 
Dim bf As New Runtime.Serialization.Formatters.Binary.BinaryFormatter() 
bf.Serialize(ms, myObject) 
myObjectSize = ms.Position 
Các vấn đề liên quan