Bộ nhớ là static hoặc động được phân bổ. Phân bổ động là những gì bạn nhận được khi phân bổ bộ nhớ trong thời gian chạy, với ví dụ new
và malloc
. Phân bổ tĩnh là "phần còn lại". Bộ nhớ cho các biến thành viên lớp được cấp phát với cá thể lớp, vì vậy nếu nó được cấp phát tĩnh, các thành viên kết thúc trong cùng một phần của bộ nhớ, và nếu nó được cấp phát động, các thành viên sẽ kết thúc nơi bộ nhớ động cư trú. Điều này cũng đúng cho các biến thành viên con trỏ, nhưng bộ nhớ thực mà nó trỏ vào có thể là động (new
và malloc
) hoặc được cấp phát tĩnh.
int i = 0;
int* pi = &i; // pi points at statically allocated memory
pi = new int(0); // pi points at dynamically allocated memory
Vì vậy, nếu bạn có một trường hợp lớp tĩnh, bộ nhớ cho nó và các thành viên của nó là thường bố trí trong đoạn mã, nhưng đó là một chi tiết thực hiện.
Nếu thành viên là con trỏ trỏ đến bộ nhớ được cấp phát động, bộ nhớ đó sẽ là trong đó người cấp phát đã sử dụng quyết định. "Heap" là chi tiết triển khai phổ biến nhất của bộ nhớ được cấp phát động, mà bạn thường là nhận khi sử dụng new
và malloc
, nhưng có thể sử dụng bộ phân bổ tùy chỉnh điều khiển bộ nhớ ở nơi khác, ngay cả trong đoạn mã.
Nguồn
2015-04-16 08:58:46
Câu trả lời duy nhất cho đến nay chỉ ra sự khác biệt về hành vi của biến tĩnh trong bài và trước C++ 11 – senfen
Chính xác hơn, bởi không * heap * bạn thực sự có nghĩa là không * động *. Các đối tượng được cấp phát động cũng có thể nằm trong phân đoạn tĩnh nếu một trình phân bổ tùy chỉnh được sử dụng. "Heap" là một chi tiết triển khai mà chỉ xảy ra được sử dụng nhiều nhất. –
Hãy coi chừng rằng tôi không nghĩ rằng Visual C++ thực hiện chủ đề an toàn tĩnh initialisation (ma thuật statics) trước khi VS2015. – sjdowling