Hiểu rõ về bộ nhớ của biến trong C++

Đây là bài 10/43 bài của series môn học Nhập môn lập trình

1. Hình dung về bộ nhớ trong lập trình

1.1. Khái niệm memory cell

Gọi là tế bào nhớ. Là khối lưu trữ dữ liệu nhỏ nhất được tạo ra. Một memory cell lưu trữ 1 bit.

Diagram of memory cell
Sơ đồ mạch của một tế bào nhớ

Một tế bào nhớ bao gồm một transistor và một tụ điện. Transistor cho phép tụ điện tích trữ điện tích (electron). Khi tụ điện tích điện đủ sẽ đại diện cho bit 1 (hiệu điện thế cao – high voltage level), khi tụ điện giải phóng điện tích sẽ đại diện cho bit 0 (hiệu điện thế thấp – low voltage level).

Memory cell arrange in grid
Các tế bào nhớ thường sắp xếp theo dạng lưới

Các tế bào nhớ thường được sắp xếp theo dạng lưới. Mỗi hàng gồm có 8 tế bào nhớ, hình thành nên một byte. Người ta quy định đó là smallest addressable unit of memory.

Grid with eight memory cell
Các giá trị nhị phân được lưu trữ trong memory cell

Bộ nhớ có những tế bào nhớ có thể được truy xuất ngẫu nhiên, gọi là Random Access Memory (RAM).

1.2. Khái niệm smallest addressable unit of memory

Tạm dịch là đơn vị nhỏ nhất có thể đánh địa chỉ để quản lý bộ nhớ. Đơn vị này là gồm 8 bit liên tiếp (1 byte). Tạm gọi là ô nhớ (các bạn đừng nhầm lẫn với memory cell, memory cell là tế bào nhớ chứ không phải ô nhớ).

Mỗi ô nhớ được đánh địa chỉ để CPU có thể truy xuất vào bộ nhớ. Địa chỉ thường được biểu diễn dưới dạng hệ cơ số 16 (hexadecimal). Ví dụ như 0x008888ff0x001002fe,…(0x là quy ước trong C/C++, chữ số bắt đầu bằng 0x thì hiểu đó là số nguyên được biểu diễn dưới dạng hệ cơ số 16).

Các ô nhớ có địa chỉ duy nhất và được đánh số từ 0 trở đi. Số lượng địa chỉ có thể đánh cho ô nhớ phụ thuộc vào độ rộng thanh ghi trong CPU. Ví dụ, CPU 32 bit thì có 2^32 địa chỉ có thể đánh cho các ô nhớ trong RAM.

Địa chỉ của các ô nhớ
Địa chỉ của các ô nhớ

2. Điều gì xảy ra sau khi khai báo biến?

Khi gặp một lệnh khai báo biến:

int a;
float f;

Chương trình sẽ cấp phát cho biến số ô nhớ liền kề (tạm gọi là vùng nhớ) có kích thước tương ứng với kích thước kiểu dữ liệu của biến.

Ví dụ: Khi khai báo một biến a kiểu int 4 bytes, chương trình sẽ tự động cấp phát 1 vùng nhớ 4 bytes (gồm 4 ô nhớ liền kề đang trống và không bị sử dụng bởi chương trình khác). Rồi lưu lại địa chỉ của ô nhớ đầu tiên mà biến nắm giữ và xem đó là địa chỉ của biến a, chẳng hạn là 0x0000fffe. Khi đó, mỗi lần gọi tới biến a thì hệ thống sẽ dùng địa chỉ 0x0000fffe để truy xuất dữ liệu lưu trong biến đó.

Địa chỉ của biến là địa chỉ ô nhớ đầu tiên của vùng nhớ mà biến nắm giữ
Địa chỉ của biến là địa chỉ ô nhớ đầu tiên của vùng nhớ mà biến nắm giữ

Hệ điều hành sẽ tạo ra một bảng để đối chiếu, ánh xạ giữa tên biến và địa chỉ. Ví dụ:

Tên biếnĐịa chỉ
name0x0000ffef
age0x0f001ffff
x0x01020304
i0x040203ff

3. Chương trình xuất ra đa chca biến

Với ngôn ngữ C/C++, bạn có thể biết địa chỉ của một biến được cấp phát trong bộ nhớ thông qua toán tử &. Bên dưới là chương trình in ra địa chỉ của các biến.

#include <iostream> 
using namespace std; 
int main() 
{
	int a;
	float b;
	cout << "Address of a: " << &a << endl;
	cout << "Address of b: " << &b << endl;
	system("pause");
}
Kết quả chạy lần 1
Address of a: 00F6FDFC
Address of b: 00F6FDF0
Kết quả chạy lần 2
Address of a: 0098FB80
Address of b: 0098FB74

Qua 2 lần chạy chương trình thì địa chỉ của các biến khác nhau. Có nghĩa, việc cấp phát vùng nhớ cho biến là hoàn toàn được thực thi tự động bởi hệ điều hành. Ô nhớ nào đang trống tại thời điểm chạy chương trình sẽ được cấp phát cho biến.

Các bạn có biết tại sao CPU 32 bit hay hệ điều hành 32 bit chỉ hỗ trợ tối đa 4GB RAM không? Dù có gắn thanh RAM 8GB vào thì cũng chỉ nhận 4GB thôi?

Các bạn có thể comment bên dưới để cho mình biết nhé!

5/5 - (3 bình chọn)
Bài trước và bài sau trong môn học<< Các lệnh gán và nhập xuất cơ bản trong C++Toán tử số học và toán tử quan hệ trong C++ >>
Chia sẻ trên mạng xã hội:

1 bình luận về bài viết “Hiểu rõ về bộ nhớ của biến trong C++

Trả lời

Lưu ý:

1) Vui lòng bình luận bằng tiếng Việt có dấu.

2) Khuyến khích sử dụng tên thật và địa chỉ email chính xác.

3) Mọi bình luận trái quy định sẽ bị xóa bỏ.