[Khóa học C++] Bài 20 - Variable sizes and the sizeof operator

Share:

Bạn đã học trong Bài 18 - Variable definition, initialization, assignment, bộ nhớ (memory) trong các loại máy tính hay phần cứng hiện đại thường được tổ chức theo đơn vị byte. Nghĩa là mỗi ô nhớ (register) trong memory sẽ có kích thước 1 byte, và sẽ có một địa chỉ duy nhất cho mỗi ô nhớ chúng ta có trong memory.
Bạn có thể tưởng tượng rằng, bộ nhớ (memory) như một cột trong một file excel, hay một ngăn sách, nơi bạn có thể đặt thông tin vào và lấy thông tin ra trong mỗi ô nhớ. Nếu bạn quên về những khái niệm này, hãy quay lại bài 18 để học lại và hiểu rõ, những kiến thức này cực kì quan trọng.

Cũng ở trong bài 18, khi bạn khai báo một biến integer, bạn sẽ biết được biến này lấy đi 4 ô nhớ lien6 tiếp (register) trong memory.
Và trong bài này, bạn sẽ đi sâu hơn về bộ nhớ, kích thước các kiểu biến, và toán tử sizeof.

Điều đầu tiên bạn cần nhớ, máy tính chỉ hiểu 2 giá trị 0 và 1, đây còn gọi là những giá trị nhị phân.

Với cách biểu diễn nhị phân, mỗi bit sẽ có thể lưu trữ 2 giá trị nhị phân 0 và 1.
Và 2 bit có thể có 4 trường hợp giá trị được lưu: 00, 01, 10, 11.
Tương tự, 3 bit có thể có 8 giá trị được lưu: 000, 001, 010, 011, 100, 101, 110, 111.
Một cách tổng quát, một biến n bit có thể có 2^n giá trị.

Khi bạn khai báo một biến nào đó, nó sẽ lấy một vùng nhớ trong bộ nhớ để làm nơi lưu trữ, ví dụ biến integer sẽ lấy 4 byte, biến double lấy 8 byte, biến char lấy 1 byte, vv.

Điều thứ 2 bạn cần ghi nhớ, bộ nhớ máy tính là hữu hạn, cho nên việc bạn khai báo biến tùy tiện sẽ tốn bộ nhớ, nhiều khi ra các lỗi như tràn bộ nhớ (stack overflow). Nhưng thời đại ngày nay, bộ nhớ máy tính rất lớn, nên đây không phải là một vấn đề quá lớn đối với các chương trình nhỏ.
Nhưng khi bạn làm các chương trình rất lớn (có cả 100.000 biến cần được khai báo), thì bạn phải khai báo biến một cách hợp lý, khi nào dùng integer, khi nào dùng double, khi nào dùng char, vv. để tiết kiệm bộ nhớ, nhất là trong lập trình nhúng (embedded).

The size of C++ basic data types

Ở phần trên, bạn đã biết khi khai báo một biến nào đó, bộ nhớ của bạn sẽ dành ra một vài ô nhớ để lưu trữ biến. Bảng sau đây tóm tắt cho bạn một số kiểu dữ liệu và kích thước nhỏ nhất của nó. Vì sao là kích thước nhỏ nhất thì bạn đọc tiếp phần bên dưới.

Category
Type
Minimum Size
Note
boolean
bool
1 byte
character
char
1 byte
May be signed or unsigned
Always exactly 1 byte
wchar_t
1 byte
char16_t
2 bytes
C++11 type
char32_t
4 bytes
C++11 type
integer
short
2 bytes
int
2 bytes
long
4 bytes
long long
8 bytes
C99/C++11 type
floating point
float
4 bytes
double
8 bytes
long double
8 bytes

Lý do chúng tôi để cập về kích thước nhỏ nhất là vì, kích thước của biến trong C++ phụ thuộc vào 2 thứ là compiler và kiến trúc máy tính.
Chúng tôi có một ví dụ để bạn hiểu rõ điều này, kiểu integer trong kiến trúc một số chip ARM là 2 byte, và đây là kích thước nhỏ nhất, không có kiểu integer 1 byte tồn tại (trong ngôn ngữ C thì integer 1 byte có tồn tại) trong C++. Tuy nhiên, chúng ta thường lập trình C++ trên các kiến trúc intel ngày nay, thì kiểu integer có kích thước 4 byte.

Để giúp cho việc xác định đúng kích thước biến khi lập trình, C++ cung cấp toán tử sizeof cho chúng ta.

Bạn có thể chạy chương trình sau để hiểu rõ hơn về toán tử sizeof:

Và đây là kết quả bạn có thể nhìn thấy nếu bạn biên dịch trên Visual Studio 2013, kiến trúc máy tính intel 64bit:

Khi bạn thay đổi kiến trúc máy tính và trình biên dịch, thì kết quả trên có thể sẽ bị thay đổi.
Bạn cũng lưu ý một điều nếu bạn lấy sizeof của kiểu void thì sẽ gây ra một lỗi, vì void không có kích thước.



Không có nhận xét nào