Bộ nhớ cho chuỗi có thể hoặc không nằm trong lớp string
. Có thể (và có thể), lớp string
sẽ quản lý bộ nhớ riêng của nó, chỉ có một con trỏ đến bộ nhớ được sử dụng để lưu trữ dữ liệu. Ví dụ:
struct Airlane {
String Name {
char *data; // size = 4
size_t size; // size = 4
}
int diameter; // size = 4
int weight; // size = 4
}; // size = 16
Lưu ý rằng những thứ đó không nhất thiết là kích thước thực, chúng chỉ là ví dụ.
Cũng lưu ý rằng trong C++ (không giống như C, ví dụ), cho mỗi class T
, sizeof T
là hằng số thời gian biên dịch, có nghĩa là các đối tượng không bao giờ có kích thước động. Điều này có nghĩa là: Ngay sau khi bạn cần dữ liệu có kích thước động thời gian chạy, phải có các vùng nhớ bên ngoài (w.r.t. the object). Điều này có thể ngụ ý việc sử dụng các vùng chứa tiêu chuẩn như std::string
hoặc std::vector
hoặc thậm chí tài nguyên được quản lý theo cách thủ công.
Điều này có nghĩa là, operator new
không cần biết kích thước động của tất cả các thành viên, đệ quy, mà chỉ là kích thước của lớp ngoài cùng, thứ mà bạn phân bổ. Khi lớp bên ngoài này cần nhiều bộ nhớ hơn, nó phải tự quản lý nó. Một số gương mẫu p-code:
Airline* myPlane = new Airline {
Name = {
data = new char[some-size]
...
}
...
}
Các phân bổ bên trong được thực hiện bởi các nhà thầu nắm giữ:
Airline::Airline() : string(), ... {}
string::string() : data(new char[...] ... {}
operator new
không có gì khác, nhưng để phân bổ một số bộ nhớ kích thước cố định là "đất" cho Airline
(xem p-code đầu tiên) và sau đó là "seed" Airline
s constructor, chính nó phải quản lý tuổi thọ của nó trong khối lượng "đất" bị giới hạn, bằng cách gọi hàm tạo chuỗi (ngầm hoặc rõ ràng), chính nó thực hiện một số khác new
.
phỏng đoán của tôi, không biết C++, là nó chỉ lưu trữ một con trỏ tới chuỗi có nội dung thực sự ở đâu đó trong heap. –