Sau đây là tất nhiên không hoàn toàn chính xác. Mang nó với một hạt muối khi bạn đọc nó :)
Vâng, ba điều bạn đề cập đến là thời gian lưu trữ tự động, tĩnh và động , có liên quan đến thời gian các vật thể sống và khi chúng bắt đầu cuộc sống.
Thời gian lưu trữ tự động
Bạn sử dụng thời lượng lưu trữ tự động cho thời gian ngắn và dữ liệu nhỏ , chỉ cần cục bộ trong một số khối:
if(some condition) {
int a[3]; // array a has automatic storage duration
fill_it(a);
print_it(a);
}
Thời gian tồn tại kết thúc ngay khi chúng ta thoát khỏi khối và nó bắt đầu ngay khi đối tượng được xác định. Chúng là loại thời lượng lưu trữ đơn giản nhất và nhanh hơn thời lượng lưu trữ động cụ thể.
Thời lượng lưu trữ tĩnh
Bạn sử dụng thời lượng lưu trữ tĩnh cho các biến miễn phí, có thể được truy cập bởi bất kỳ mã nào mọi lúc, nếu phạm vi của chúng cho phép sử dụng như vậy (phạm vi không gian tên) và cho các biến cục bộ cần kéo dài thời gian thoát khỏi phạm vi của chúng (phạm vi cục bộ) và cho các biến thành viên cần được chia sẻ bởi tất cả các đối tượng của lớp (phạm vi lớp). Tuổi thọ của chúng phụ thuộc vào phạm vi chúng nằm trong. Chúng có thể có phạm vi không gian tên và phạm vi cục bộ và phạm vi lớp . Điều đúng về cả hai là, một khi cuộc sống của họ bắt đầu, cuộc đời kết thúc vào cuối chương trình . Đây là hai ví dụ:
// static storage duration. in global namespace scope
string globalA;
int main() {
foo();
foo();
}
void foo() {
// static storage duration. in local scope
static string localA;
localA += "ab"
cout << localA;
}
Chương trình in ababab
, vì localA
không bị phá hủy khi thoát khỏi khối của nó. Bạn có thể nói rằng các đối tượng có phạm vi cục bộ bắt đầu trọn đời khi điều khiển đạt đến định nghĩa của chúng . Đối với localA
, nó xảy ra khi cơ thể của chức năng được nhập vào. Đối với các đối tượng trong phạm vi không gian tên, thời gian bắt đầu khi khởi động chương trình . Điều này cũng đúng với các đối tượng tĩnh của phạm vi lớp:
class A {
static string classScopeA;
};
string A::classScopeA;
A a, b; &a.classScopeA == &b.classScopeA == &A::classScopeA;
Như bạn thấy, classScopeA
không bị ràng buộc với các đối tượng cụ thể của lớp, mà với chính lớp đó. Địa chỉ của cả ba tên trên đều giống nhau và tất cả đều biểu thị cùng một đối tượng. Có một quy tắc đặc biệt về thời điểm và cách thức các đối tượng tĩnh được khởi tạo, nhưng bây giờ chúng ta không quan tâm đến điều đó. Điều đó có nghĩa là bởi thuật ngữ khởi tạo tĩnh fiasco .
Thời lượng lưu trữ động
Thời gian lưu trữ cuối cùng là động. Bạn sử dụng nó nếu bạn muốn có các đối tượng sống trên một hòn đảo khác và bạn muốn đặt các con trỏ xung quanh tham chiếu chúng. Bạn cũng sử dụng chúng nếu các đối tượng của bạn lớn và nếu bạn muốn tạo các mảng có kích thước chỉ được biết khi chạy . Do tính linh hoạt này, các đối tượng có thời gian lưu trữ động rất phức tạp và chậm quản lý. Các đối tượng có thời lượng động đó bắt đầu trọn đời khi một lệnh gọi toán tử mới thích hợp xảy ra:
int main() {
// the object that s points to has dynamic storage
// duration
string *s = new string;
// pass a pointer pointing to the object around.
// the object itself isn't touched
foo(s);
delete s;
}
void foo(string *s) {
cout << s->size();
}
Cuộc đời của nó chỉ kết thúc khi bạn gọi xóa cho họ. Nếu bạn quên điều đó, những đối tượng đó không bao giờ kết thúc trọn đời. Và các đối tượng lớp xác định hàm tạo được khai báo của người dùng sẽ không có hàm hủy của chúng được gọi. Các đối tượng có thời lượng lưu trữ động yêu cầu xử lý thủ công thời gian sống và tài nguyên bộ nhớ liên quan. Thư viện tồn tại để dễ dàng sử dụng chúng. Bộ sưu tập rác rõ ràng cho các đối tượng cụ thể có thể được thiết lập bằng cách sử dụng một con trỏ thông minh:
int main() {
shared_ptr<string> s(new string);
foo(s);
}
void foo(shared_ptr<string> s) {
cout << s->size();
}
Bạn không cần phải quan tâm đến việc gọi xóa: Ptr được chia sẻ sẽ giúp bạn, nếu con trỏ cuối cùng tham chiếu đến đối tượng nằm ngoài phạm vi. Bản thân ptr được chia sẻ có thời gian lưu trữ tự động. Vì vậy, thời gian tồn tại của nó được quản lý tự động, cho phép nó kiểm tra xem nó có nên xóa đối tượng được trỏ tới động trong hàm hủy của nó hay không. Để tham khảo shared_ptr, hãy xem tài liệu nâng cao: http://www.boost.org/doc/libs/1_37_0/libs/smart_ptr/ Shared_ptr.htmlm