Chuyển đến nội dung chính

cấp phát bộ nhớ động


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

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;

Để 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 SegmentUninitialized 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

Bài đăng phổ biến từ blog này

Entry Test của FPT

IQ - Kiểm tra tư duy logic (8/20) - GMAT- Kiểm tra khả năng tính toán trong thời gian ngắn (8/20) - Tiếng Anh (18-> 25/50) - Các bài thi chuyên môn - FE (8/20) IQ: lên mạng tìm "IQ test" là ra đầy. + GMAT: Những câu trắc nghiệm tính toán đơn giản kiểu như sau:  1 . Một shop thời trang sale off quần jeans 15 %, quần jeans giá 450 $, người mua đưa 500 $, hỏi cashier trả lại bao nhiêu $ tiền thừa.? 2 . 100 % là 180 , vậy 150 là bao nhiêu %? Tiếng anh: Cỡ như thi TOEIC thôi. Chuyên môn: Mobile thì trắc nghiệm Java. Qúa trình tuyển như sau :v Lần 1: Test IQ, Tiếng Anh( mình làm í ẹ khoảng 50% mà vẫn được) , Java Lân 2: được gọi điện lên :)) + Gioi thiệu bản thân + Họ chỉ hỏi các câu căn bản như: -. OOP: là gì, 4 tính chất, ví dụ, khác nhau giữa interface và abstract - CODE: hầu toàn các bài toán vòng for :)) , cẩn thận mấy câu kế thừa. SQL (distinct, view, function, cursor, store procedure, ...v.v.), nhớ có câu cộng 2 số int không dùng biến đệm hơi khoai haha + Nói ch...

Java: Java Package-Thư viện trong Java

Giới thiệu về Package Các bạn mới học lập trình Java thường không dể ý tới package vì các bạn toàn tạo file .java vào cùng 1 chỗ, không cần sắp xếp, không cần quản lý truy nhập. Nhưng để tăng kỹ năng lập trình với Java, các bạn cần phải tìm hiểu về package trong Java. Các bạn có thể tham khảo định nghĩa sau: Package được dùng để đóng gói các lớp trong chương trình lại với nhau thành một khối. Đây là cách tốt nhất để lưu trữ các lớp gần giống nhau hoặc có cùng một module thành một khối thống nhất – để đáp ứng 1 khối chức năng. Từ đây mình sẽ giới thiệu thêm với các bạn các câu lệnh nhâp khẩu,nó có định dạng như sau : Định dạng :  import javaPackageNameImport;    Nó giống như khai báo thư viện ở các ngôn ngữ lập trình khác.Như vậy,chỉ khi các bạn nhập khẩu chúng,các bạn mới có thể sử dụng thư viện mà chúng cung cấp cho ta. VD :    import java.util.Date;   import java.text.SimpleDateFormat; Lưu ý : -Các câu lệnh nhập khẩu rất nhiều và...

Khác nhau giữa Array và ArrayList và HashMap

Collection bản chất là tập các lớp dùng để lưu trữ danh sách và có khả năng tự co giãn khi danh sách thay đổi : Thêm , sửa , xóa , chèn … Hai lớp Collection thường được sử dụng nhiều nhất là ArrayList và Hashmap Giới thiệu về ArrayList ArrayList sử dụng cấu trúc mảng để lưu trữ phần tử , tuy nhiên có hai đặc điểm khác mảng : Không cần khai báo trước kiểu phần tử . Không cần xác định trước số lượng phần tử ( kích thước mảng ). N ó có kh ả năng truy c ậ p ph ầ n t ử ng ẫ u nhiên (Do th ừ a k ế t ừ interface RandomAccess ). P hương thức khởi tạo ● ArrayList () ● ArrayList (Collection c) ● ArrayList ( int initialCapactity ) Các phương thức chính ● add(Object o) ● remove(Object o) ● get( int index) ● size() ● isEmpty () ● contains(Object o) ● clear() Giới thiệu về HashMap ● Là ki ể u t ậ p h ợ p t ừ đ i ể n, HashMap cho phép truy xu ấ t tr ự c ti ế p t ớ i m ộ ...