DIEM *p ; p = new DIEM ;
Có thể dùng new và tên lớp để cấp phát một vùng nhớ cho một hoặc một dẫy các đối tượng. Bộ nhớ cấp phát được quản lý bởi một con trỏ kiểu đối tượng. Ví dụ sau khi đã định nghĩa lớp DIEM như trong mục trên, ta có thể thực hiện các lệnh cấp phát bộ nhớ như sau:
int n = 10;
DIEM *p, *q, *r ;
p = new DIEM ; // Cấp phát bộ nhớ cho một đối tượng
q = new DIEM[n] ; //Cấp phát bộ nhớ cho n đối tượng
r = new DIEM(200,100); // Cấp phát bộ nhớ và khởi gán cho
// một đối tượng
11.2. Làm việc với đối tượng thông qua con trỏ
+ Giả sử con trỏ q trỏ tới địa chỉ đầu vùng nhớ của một dẫy đối tượng. Khi đó:
+ Giả sử con trỏ p trỏ tới vùng nhớ của một đối tượng nào đó. Khi đó:
- Để biểu thị một thành phần (thuộc tính hoặc phương thức) của đối tượng, ta dùng mẫu viết sau: p -> tên_thành_phần
- Để biểu thị đối tượng, ta dùng mẫu viết sau: *p
biểu thị đối tượng thứ i, ta dùng một trong các mẫu viết sau:q[i] *(q+i) .
- Để biểu thị một thành phần (thuộc tính hoặc phương thức) của đối tượng thứ i, ta dùng một trong các mẫu viết sau:
q[i].tên_thành_phần
(q+i)-> tên_thành_phần
new là câu lệnh cấp phát động một vùng nhớ cho một kiểu dữ liệu
new[] cũng tương tự, nhưng nó cấp phát vùng nhớ cho một mảng
delete là lệnh hủy vùng nhớ đã cấp phát cho một kiểu dữ liệu
delete[] tương tự là lệnh hủy một mảng
delete contro;
- Stack: Tất cả biến được khai báo bên trong hàm sẽ nhận bộ nhớ từ stack trong C/C++.
- Heap: Được sử dụng để cấp phát bộ nhớ động khi chương trình chạy.
Nhiều khi, bạn không biết trước bao nhiêu bộ nhớ bạn sẽ cần để lưu thông tin cụ thể trong một biến đã được định nghĩa và kích cỡ bộ nhớ cần thiết có thể được quyết định tại run time.Bạn có thể cấp phát bộ nhớ tại run time bên trong Heap cho biến đó với một kiểu đã cho bởi sử dụng một toán tử đặc biệt trong C/C++ mà trả về địa chỉ của không gian đã cấp phát.

Hinhvuong hinhVuong= new Hinhvuong()
khi ta viết new Hinhvuong() la tao ra 1 đối tượng , đối tượng này được lưu trong heap
--> đối tượng được lưu trong heap
--> đối tượng được lưu trong heap
Hinhvuong hinhVuong hinhVuong là tên biến tham chiếu được lưu trong stack;
--> biến, tham chiếu, method thì được lưu trong stack;
--> biến, tham chiếu, method thì được lưu trong stack;
Để cấp phát bộ nhớ động trong C, chúng ta có 2 cách:
1. void* malloc (size_t size);
2. void* calloc (size_t num, size_t size);
void * realloc (void * pointer , size_t size );
void free (void * pointer );
So sánh

Sử dụng
- Khi sử dụng malloc phải tính toán kích thước vùng nhớ cần cấp phát trước rồi truyền vào cho malloc
- Khi sử dụng calloc chỉ cần truyền vào số phần tử và kích thước 1 phần tử, thì calloc sẽ tự động tính toán và cấp phát vùng nhớ cần thiết
Ví dụ: Cấp phát mảng 10 phần tử kiểu int:
int *a = (int *) malloc( 10 * sizeof( int ));
int *b = (int *) calloc( 10, sizeof( int ))
Hiệu suất / Perfomance
malloc nhanh hơn so với calloc. Lý do là calloc ngoài việc có nhiệm vụ cấp phát vùng nhớ như malloc, nó còn phải gán giá trị cho tất cả các phần tử của vùng nhớ vừa cấp phát = 0
int *a = (int *) calloc(10, sizeof( int ));
tương đương với
int *b = (int *) malloc( 10 * sizeof( int ));
memset(b, 0, 10 * sizeof(int)); Như bạn thấy thì calloc làm 2 bước:
1. Cấp phát bộ nhớ giống như malloc
2. Khởi tạo giá trị vùng nhớ = 0 tương tự như lúc sử dụng hàm memset


Code Segment
Như các bạn đã biết, ngôn ngữ khi chúng ta lập trình như C/C++, Java và ngôn ngữ máy tính có thể hiểu là 2 ngôn ngữ hoàn toàn khác nhau. Khi một chương trình được biên dịch, nó sẽ được chuyển thành các lệnh mã máy chỉ bao gồm 0 và 1. Đây là vùng nhớ chứa mã máy để thực thi chương trình của các bạn.
Data Segment
Đây là nơi lưu trữ những biến “tĩnh” và biến có phạm vi global. Thường được chia làm 2 vùng nhỏ hơn là Initialized Data Segment và Uninitialized Data Segment.
Initialized Data Segment chứa giá trị của những biến global và biến “tĩnh” đã được khởi tạo. Uninitialized Data Segment (hay còn gọi là BBS Segment) là vùng nhớ lưu trữ những biến “tĩnh” và biến Global được khởi tạo với giá trị bằng 0 hay chưa được khởi tạo.
Stack Segment
Stack có thể được biết đến như một cấu trúc First In – Last Out (FILO). Trong bộ nhớ của máy tính, Stack là một phân khúc lưu trữ những biến tạm thời được tạo ở trong phương thức ( kể cả hàm main()). Phân khúc này được CPU quản lý và tối ưu khá chặt chẽ. Khi một biến được khai báo trong hàm, nó sẽ được push vào trong Stack, và khi hàm đó kết thúc, toàn bộ những biến đã được đẩy vào trong stack sẽ được pop và giải phóng. Vì đặc tính này cho nên biến lưu trên Stack mang tính chất Local.Khi bạn sử dụng biến lưu trên Stack, bạn sẽ không phải quan tâm đến việc cấp phát và thu hồi biến đó. Ngoài ra, truy cập ở phân khúc Stack sẽ nhanh hơn một chút so với Heap nhưng bù lại phân khúc này lại có kích thước nhỏ hơn Heap khá nhiều lần.
Heap Segment
Heap là phân khúc bộ nhớ cho bạn cấp phát tự do. Tuy nhiên nó lại không được quản lý bởi CPU, do đó bạn phải tự quản lý toàn bộ những vùng nhớ mà bạn cấp phát trên Heap, nếu bạn quản lý không kỹ và bỏ sót sẽ gây ra hiện tượng memory leak. Để cấp phát vùng nhớ trên Heap, bạn có thể dùng malloc() – tức là memory allocation hoặc new. Để thu hồi vùng nhớ bạn có thể dùng dealloc() – tức là memory deallocation hoặc delete. Biến nằm trên heap do bạn quản lý, do đó, nó có thể được sử dụng giữa các phương thức với nhau. Theo kinh nghiệm của tôi, việc bạn sử dụng stack hay heap phụ thuộc vào vòng đời mà bạn muốn thiết lập cho biến.
Nhận xét
Đăng nhận xét