2010-10-19 46 views
20

Bất cứ ai có thể cho tôi biết có bao nhiêu byte chuỗi dưới đây sẽ mất?Chuỗi sẽ mất bao nhiêu byte?

string abc = "a"; 
+3

phải mất 17 byte trong nguồn. vui lòng nêu rõ câu hỏi của bạn. bạn đang nghĩ trong bộ nhớ khi chạy, khi được mã hóa thành byte [], ... –

+3

Bạn sẽ cần phải làm rõ một số điều, ví dụ: Chuỗi này, bạn sẽ lưu nó ở đâu? Trong bộ nhớ, như kiểu .NET "string"? Trong một tập tin? Với mã hóa nào? Tại sao bạn quan tâm? Nếu vào.NET của bộ nhớ, mỗi chuỗi bổ sung với cùng một nội dung không nhất thiết phải sử dụng nhiều bộ nhớ hơn vì cũ có thể được tái sử dụng – Onkelborg

+2

Phải mất ít mà bạn thực sự không nên quan tâm về nó :-) – paxdiablo

Trả lời

27

Từ article on strings tôi:

Trong việc thực hiện hiện tại ít nhất, chuỗi mất 20+ (n/2) * 4 byte (làm tròn giá trị của n/2 xuống), trong đó n là số ký tự trong chuỗi. Loại chuỗi là bất thường ở chỗ kích thước của đối tượng chính nó thay đổi. Các lớp khác chỉ làm điều này (theo như tôi biết) là mảng. Về cơ bản, một chuỗi là một mảng ký tự trong bộ nhớ, cộng với độ dài của mảng và độ dài của chuỗi (trong ký tự). Độ dài của mảng không phải lúc nào cũng giống như độ dài trong các ký tự, vì các chuỗi có thể được "phân bổ quá mức" trong mscorlib.dll, để làm cho chúng dễ dàng hơn. StringBuilder tạo ra một chuỗi với một mảng ký tự nội bộ lớn hơn so với các nội dung hiện tại yêu cầu, sau đó nối thêm vào chuỗi đó cho đến khi các chuỗi ký tự có thể thay đổi nội dung. mảng ký tự không còn đủ lớn để đối phó, lúc đó nó tạo ra một chuỗi mới với một mảng lớn hơn. Thành viên có độ dài chuỗi cũng chứa một cờ trong bit trên cùng của nó để nói chuỗi có chứa bất kỳ ký tự không phải ASCII nào không. Điều này cho phép tối ưu hóa thêm trong một số trường hợp.

Tôi nghi ngờ đã được viết trước khi tôi có cơ hội làm việc với CLR 64 bit; Tôi nghi ngờ trong đất 64-bit mỗi chuỗi chiếm hoặc nhiều hơn 4 hoặc 8 byte.

EDIT: Tôi đã viết lên một blog post gần đây bao gồm thông tin 64-bit (và mâu thuẫn ở trên một chút cho x86 ...)

+0

Vâng, nó làm cho chuỗi rất không phổ biến nếu bạn muốn lưu trữ số lượng lớn chúng trong bộ nhớ ... –

+0

Vì vậy, một chuỗi ký tự 1 sẽ mất 20 byte theo bài viết của bạn. Và 20 byte là dữ liệu đối tượng. Nhân vật được lưu trữ ở đâu? :-) – meze

+0

@meze: Không chắc chắn ý bạn là gì bởi "20 byte là dữ liệu đối tượng". Bạn có thể làm rõ? Ngoài ra, hãy xem http://msmvps.com/blogs/jon_skeet/archive/2011/04/05/of-memory-and-strings.aspx để biết thêm thông tin gần đây - sẽ thêm thông tin đó vào. –

1

Nếu bạn hỏi về kích thước của string đối tượng thì đó là sai lầm khi hỏi về kích thước của nó, không có trình gỡ rối, không thể nói chính xác nó là gì. Không chắc chắn rằng nó có thể với trình gỡ lỗi hoặc. string sử dụng con trỏ trong nội bộ.

Nếu bạn hỏi về kích thước chuỗi ký tự mà nó chứa thì đó là 4, vì chuỗi được lưu trữ trong UTF-16. Tất cả các ký tự trong Basic Multilingual Plane đều được mã hóa với hai byte.

9

Về cơ bản, mỗi đối tượng chuỗi yêu cầu 20 byte không đổi cho dữ liệu đối tượng. Bộ đệm yêu cầu 2 byte cho mỗi ký tự. Ước tính mức sử dụng bộ nhớ cho chuỗi theo byte: 20 + (2 * Chiều dài). Vì vậy, thông thường Bộ nhớ trong CLR cho chuỗi này: 22 byte

Tuy nhiên khi chúng tôi chuyển hoặc gửi chuỗi này đến đầu kia hoặc sử dụng khác, chúng tôi không cần nhiều bộ nhớ này (chúng tôi không bao giờ cần 20 byte) dữ liệu đối tượng). Vì vậy, nó phụ thuộc vào loại mã hóa bạn chọn, trong khi bạn sử dụng nó.

Đối với mã hóa mặc định, sẽ mất 1 byte cho ký tự.

Vì vậy, Trả lời là 1 byte để mã hóa mặc định.

Bạn có thể kiểm tra với mã này:

Encoding.Default.GetBytes("a"); //It will give you a byte array of size 1. 
Encoding.Default.GetBytes("ABC"); //It will give you a byte array of size 3. 
+0

Điều đó không quan trọng. Nó phụ thuộc vào loại mã hóa bạn chọn, khi bạn sử dụng chúng. –

+1

Tốt hơn. Đã xóa phiếu bầu. –

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