4.3.12 Kích thước thực của string

Chúng ta đã nói trước đây rằng chúng ta có thể lấy thông tin về chiều dài của chuỗi bằng cách sử các hàm thành viên là size và length, nhưng chúng ta không đề cập đến việc giá trị thu được từ các hàm đó chỉ đúng một phần. Nó cho chúng ta biết có bao nhiêu ký tự hiện đang được giữ trong chuỗi, nhưng không nói gì về bộ nhớ chiếm bởi bộ đệm (còn gọi là buffer) được cấp phát cho chuỗi đó. Tất nhiên, kích thước buffer phải lớn hơn chuỗi chính nó nếu chúng ta muốn chương trình hoạt động hiệu quả.

Mỗi lần chúng ta mở rộng chuỗi, ví dụ: nối một chuỗi khác vào nó, nội dung mới được đặt trong buffer. Nếu các buffer là đủ lớn, việc mở rộng chuỗi không yêu cầu mở rộng các buffer. Tất nhiên, khi buffer đầy và chuỗi đang được mở rộng tiếp, thì buffer phải được phân bổ lại để phù hợp với nội dung mới. Quá trình này là hoàn toàn trong suốt và trong nhiều trường hợp, bạn thậm chí không cần phải biết về nó.

string cung cấp một số phương tiện kiểm tra buffer đang làm việc như thế nào và để nhận ra tình trạng của chuỗi.

Ví dụ, bạn có thể yêu cầu bất kỳ chuỗi nào đó cho ra kích thước của bộ đệm hiện đang được cấp phát. Câu trả lời đến từ hàm thành viên gọi có tên là capacity. Bạn có thể sử dụng nó theo cách sau:

int currently_used = S.capacity();

Tất nhiên, kết quả của hàm luôn lớn hơn hoặc bằng độ dài của chuỗi.

Mỗi chuỗi có thể lớn lên, nhưng có một giới hạn của nó và trong trường hợp này, giới hạn không phải là bầu trời, nhưng có một giá trị được xác định cho tất cả các chuỗi trong việc đó. Bạn có thể tìm ra nó bằng cách sử dụng một hàm gọi là max_size (nó thực hiện chính xác những gì nó nói). Bạn có thể mong đợi rằng giá trị đó sẽ thực sự lớn – lớn hơn những gì mà bạn có thể cần trong các chương trình thông thường. Dưới đây là một ví dụ về cách sử dụng nó:

int not_more_than = S.max_size ();

Lưu ý: giá trị này là chung cho tất cả các chuỗi bạn sử dụng trong chương trình của bạn.

Chương trình dưới đây thể hiện sự cùng tồn tại của tất cả ba giá trị này length, capacity và max_size. Bạn hãy tự biên dịch và chạy nó, và cũng có thể thay đổi các giá trị của biến và để kiểm tra hành vi của các hàm. Đừng cố gắng tăng giới hạn trên của vòng lặp for bằng giá trị quá lớn. Nó có thể làm chết chương trình của bạn. Nếu bạn không tin thì hãy thử đi !