2013-09-16 34 views
9

Mọi người đều biết rằng trong các đối tượng Chuỗi .Net String được lưu trữ trực tiếp trong bộ nhớ heapChuỗi bộ nhớ hằng số trong C#

Tôi chỉ đang cố gắng hiểu nếu có bộ nhớ dành riêng trong .Net framework for Strings. Trong java có một bộ nhớ dành riêng cho các chuỗi được gọi là SCMP (String Memory Memory Pool), nơi các chuỗi được khởi tạo và thu thập rác giống như các đối tượng khác trong bộ nhớ heap.

+1

Tôi nghĩ Java có tính năng như vậy bởi vì trong những ngày cũ, chúng tôi có thiết bị di động có bộ nhớ hạn chế. Bây giờ chúng ta không cần một tính năng như vậy. nó đơn giản hơn nhiều cho trình biên dịch và bộ thu gom rác. –

+0

http://stackoverflow.com/questions/372547/where-do-java-and-net-string-literals-reside/372559#372559 –

Trả lời

2

Trong chuỗi văn bản .NET được "interned" để chỉ có một bản sao của mỗi chuỗi chữ.

Xem http://msdn.microsoft.com/en-us/library/system.string.intern.aspx

+0

Câu trả lời này gây hiểu nhầm. * Các chuỗi ký tự * được tập trung. Các chuỗi được tạo động được phân bổ trên heap như các đối tượng thông thường và không nhất thiết phải là duy nhất. Ví dụ nhanh: 'Object.ReferenceEquals (" abc "," ABC ".ToLowerInvariant())' đánh giá là 'false', vì chỉ chuỗi đầu tiên được tập trung. – Douglas

+0

@Douglas - Không có ý định đánh lừa. Câu trả lời nói rằng có một bản sao của mỗi chuỗi * chữ *. Tham chiếu MSDN được trích dẫn làm cho nó rất rõ ràng rằng các chuỗi được lập trình xây dựng không được thực thi, trừ khi bạn buộc chúng phải được thực thi bằng phương thức 'String.Intern'. –

+1

Ngoài ra, chỉ vì chuỗi được tập trung không có nghĩa là bộ nhớ dây nằm ở vị trí được phân bổ riêng. Không có lý do gì mà nó không thể ở trong bộ nhớ heap thông thường. Vấn đề là trình biên dịch theo dõi tất cả các chuỗi đó và đảm bảo cùng một tham chiếu được sử dụng cho tất cả các chữ, chúng không cần phải nằm trong một nhóm bộ nhớ riêng biệt để làm điều đó. – Servy

5

Tôi không nghĩ có bất cứ điều gì tương tự trong .Net.

Thay vào đó tôi đã đọc this và thú vị của nó như thế nào Strings được sử dụng:

Các CLR duy trì một bảng gọi là hồ bơi thực tập có chứa chuỗi chữ trong một chương trình. Điều này đảm bảo rằng việc sử dụng lặp đi lặp lại các chuỗi liên tục giống nhau trong mã của bạn sẽ sử dụng cùng một chuỗi tham chiếu . Lớp System.String cung cấp phương thức Intern rằng đảm bảo một chuỗi nằm trong pool nội bộ và trả về tham chiếu đến nó.

Ngoài ra kiểm tra này MSDN: -

Chúng ta đã thấy rất nhiều kịch bản mà các đống quản lý chứa ngàn cùng chuỗi lặp đi lặp lại nhiều lần. Kết quả là làm việc lớn đặt nhiều bộ nhớ được tiêu thụ bởi các chuỗi. Trong tình huống này, nó thường là tốt hơn để sử dụng string interning.

1

.Net framework bảo tồn lưu trữ chuỗi trong một bảng, Intern Pool. Bạn có thể thấy:

String interning and String.Empty - Eric Lippert

Nếu bạn có hai xâu giống hệt nhau trong một đơn vị biên soạn sau đó mã chúng ta tạo ra đảm bảo rằng chỉ có một đối tượng chuỗi được tạo ra bởi CLR cho tất cả các trường hợp mà theo nghĩa đen trong hội đồng. Điều này tối ưu hóa được gọi là "chuỗi interning".

String Interning .Net framework

Các ngôn ngữ chung thời gian chạy bảo tồn lưu trữ chuỗi bằng cách duy trì một bảng, được gọi là hồ sinh nội trú, có chứa một tham chiếu duy nhất để mỗi chuỗi chữ độc đáo tuyên bố hoặc tạo lập trình trong chương trình của bạn. Do đó, một thể hiện của một chuỗi ký tự bằng một giá trị cụ thể là chỉ tồn tại một lần trong hệ thống.