Bí mật của biến string, 32 byte nhưng không giới hạn 32 ký tự

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.

16
  1. Biến string có kích thước bao nhiêu?
  2. 32 byte dùng để làm gì?
  3. Chuỗi thật nằm ở đâu?
  4. Tổng bộ nhớ sử dụng
  5. Khi chuỗi dài hơn
  6. Nếu có 1 triệu ký tự
  7. Các từ khóa ghi nhớ
  8. Một số câu hỏi

1. Biến string có kích thước bao nhiêu?

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.


2. 32 byte dùng để làm gì?

32 byte này dùng để quản lý chuỗi, bao gồm:

  • Địa chỉ vùng nhớ chứa chuỗi.
  • Số lượng ký tự hiện có (size).
  • Dung lượng đã cấp phát (capacity).

Ví dụ:

+----------------------------+
| string s (32 byte)         |
|----------------------------|
| Địa chỉ dữ liệu            |
| Size                       |
| Capacity                   |
| ...                        |
+----------------------------+

3. Chuỗi thật nằm ở đâu?

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.


4. Tổng bộ nhớ sử dụng

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

5. Khi chuỗi dài hơn

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

6. Nếu có 1 triệu ký tự

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

7. Các từ khóa ghi nhớ

  • sizeof(string) thường là 24 hoặc 32 byte.
  • 32 byte chỉ dùng để quản lý chuỗi.
  • Dữ liệu của chuỗi được lưu trên Heap.
  • Số lượng ký tự càng nhiều thì bộ nhớ sử dụng càng lớn.
  • Giới hạn của string phụ thuộc vào bộ nhớ RAM, không phải 32 byte.

8. Một số câu hỏi

* 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.