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.
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).
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.
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ư 0x008888ff, 0x001002fe,…(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.
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 đó.
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ỉ name 0x0000ffef age 0x0f001ffff x 0x01020304 i 0x040203ff
3. Chương trình xuất ra địa chỉ của 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é!
bổ ích