Ví dụ:
string s = "Hello";
Thông thường:
sizeof(string) = 32 byte
Lưu ý: 32 byte KHÔNG phải là số ký tự tối đa mà string lưu được.
32 byte này dùng để quản lý chuỗi, bao gồm:
Ví dụ:
+----------------------------+ | string s (32 byte) | |----------------------------| | Địa chỉ dữ liệu | | Size | | Capacity | | ... | +----------------------------+
Ví dụ:
string s = "Hello";
Bộ nhớ được sử dụng như sau:
STACK
+----------------------------+
| string s (32 byte) |
| pointer --------------------------+
| size = 5 |
| capacity = 15 |
+----------------------------+ |
|
|
HEAP |
|
v
+-----------------------------------------+
| H | e | l | l | o | \0 |
+-----------------------------------------+
Chuỗi Hello mới là dữ liệu thật được lưu trong Heap.
Ví dụ:
string s = "Hello";
Bộ nhớ sử dụng gần đúng:
| Thành phần | Bộ nhớ |
|---|---|
| Đối tượng string | 32 byte |
| Chuỗi "Hello" | 6 byte (5 ký tự + '\0') |
| Tổng | Khoảng 38 byte |
string s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Chuỗi có 26 ký tự.
| Thành phần | Bộ nhớ |
|---|---|
| Đối tượng string | 32 byte |
| Dữ liệu chuỗi | 27 byte (26 ký tự + '\0') |
| Tổng | Khoảng 59 byte |
string s(1000000, 'A');
| Thành phần | Bộ nhớ |
|---|---|
| Đối tượng string | 32 byte |
| Dữ liệu chuỗi | 1.000.001 byte |
| Tổng | Khoảng 1 MB |
sizeof(string) thường là 24 hoặc 32 byte.string phụ thuộc vào bộ nhớ RAM, không phải 32 byte.* 32 byte khởi tạo biến để làm gì ?
32 byte là "người quản lý".
* Ký tự lưu trữ của biến lưu ở RAM hay ổ cứng.
Các ký tự của chuỗi mới là dữ liệu thật chiếm bộ nhớ RAM.
* Giả sử RAM tôi có 10MB thì lưu được bao nhiêu ký tự ?
Nếu giả sử:
RAM còn trống: 10 MB
Chỉ lưu ký tự ASCII (mỗi ký tự = 1 byte)
Thì:
10 MB phải quy đổi ra byte/
= 10 × 1024 × 1024 byte
= 10.485.760 byte
⇒ Có thể lưu khoảng:
10.485.760 ký tự (khoảng 10,5 triệu ký tự).
Tìm kiếm:
Quản lý bộ nhớ của string trong C++, và câu hỏi nhiều bạn lập trình c đặt ra.