🌱 C++ Storage Class - Lớp lưu trữ trong C++
Trong C++, tất cả các biến đều có Data Type (Kiểu Dữ Liệu) và Storage Class (Lớp Lưu Trữ).
- Data Type xác định loại dữ liệu và kích thước của biến.
- Storage Class xác định phạm vi hoạt động (scope) và thời gian tồn tại (lifetime) của biến.
Phân loại Storage Class
Biến trong C++ được chia thành 5 loại chính dựa trên Storage Class:
- Biến Cục Bộ (Local Variable)
- Biến Toàn Cục (Global Variable)
- Biến Tĩnh (Static Variable)
- Biến Thanh Ghi (Register Variable)
- Thread Local Storage
Local Variable - Biến cục bộ
- Khai báo: Bên trong một hàm hoặc khối mã.
- Phạm vi (Scope): Chỉ sử dụng được bên trong hàm hoặc khối mã khai báo nó.
- Thời gian tồn tại (Lifetime): Từ khi hàm được gọi đến khi hàm kết thúc.
Scope | Chỉ được truy cập từ bên trong hàm |
Lifetime | Tồn tại từ lúc gọi hàm đến khi kết thúc hàm |
➤ Ví dụ về biến Local
#include <iostream>
using namespace std;
void test();
int main()
{
// local variable to main()
int var = 5;
test();
// illegal: var1 not declared inside main()
var1 = 9;
}
void test()
{
// local variable to test()
int var1;
var1 = 6;
// illegal: var not declared inside test()
cout << var;
}
#include <iostream>
using namespace std;
void test();
int main()
{
// local variable to main()
int var = 5;
test();
// illegal: var1 not declared inside main()
var1 = 9;
}
void test()
{
// local variable to test()
int var1;
var1 = 6;
// illegal: var not declared inside test()
cout << var;
}
Biến var là một biến local trong hàm main(), và var1 là biến local trong hàm test().
Sử dụng từ khóa auto cũng là một cách để khai báo một biến local, ví dụ: auto int var. Tuy nhiên từ sau phiên bản C++11, từ khóa auto đã không còn được sử dụng với mục đích này.
Global Variable - Biến toàn cục
Nếu một biến được định nghĩa bên ngoài tất cả các function, nó được gọi là biến toàn cục - global variable.
Scope | Sử dụng cho toàn bộ chương trình Bất kỳ vị trị nào sau khi khai báo |
Lifetime | Từ khi khai báo đến khi kết thúc chương trình |
➤ Ví dụ về biến Global
#include <iostream>
using namespace std;
// Global variable declaration
int c = 12;
void test();
int main()
{
++c;
// Outputs 13
cout << c << endl;
test();
return 0;
}
void test()
{
++c;
// Outputs 14
cout << c;
}
#include <iostream>
using namespace std;
// Global variable declaration
int c = 12;
void test();
int main()
{
++c;
// Outputs 13
cout << c << endl;
test();
return 0;
}
void test()
{
++c;
// Outputs 14
cout << c;
}
➥ Các bạn có thể bấm "Run This Code", kết quả hiển thị trên màn hình console như sau.
13 14
Trong chương trình, biến c là biến global, được sử dụng cho cả 2 hàm main() và test().
Static Variable
Ở đây nhắc đến Static Local Variable, chỉ thêm 1 từ khóa static khi khai báo biến bên trong hàm.
Scope | Chỉ được truy cập từ bên trong hàm |
Lifetime | Từ khi hàm được gọi đến khi kết thúc chương trình |
Dễ thấy, biến local và static local đều chỉ được truy cập bên trong hàm, nhưng khác nhau ở chỗ, giá trị của biến static local vẫn tồn tại đến cuối chương trình.
➤ Ví dụ về biến Static Local
#include <iostream>
using namespace std;
void test()
{
// var is a static variable
static int var = 0;
++var;
cout << var << endl;
}
int main()
{
test();
test();
return 0;
}
#include <iostream>
using namespace std;
void test()
{
// var is a static variable
static int var = 0;
++var;
cout << var << endl;
}
int main()
{
test();
test();
return 0;
}
➥ Các bạn có thể bấm "Run This Code", kết quả hiển thị trên màn hình console như sau.
1 2
Trong chương trình trên, hàm test() được gọi 2 lần.
- Ở lần đầu, biến var được khai báo với từ khóa static, và giá trị bằng 0. Lệnh ++var sẽ tăng biến var lên bằng 1.
- Khi hàm test() ở lần gọi đầu này kết thúc bằng lệnh return, biến var vẫn tồn tại vì nó là biến static.
- Ở lần gọi hàm thứ 2, biến var không được khai báo lại, mà vẫn giữ giá trị cũ là 1. Sau đó lệnh ++var tăng biến var lên bằng 2.
👉 Register Variable (Không dùng trong C++11)
Từ khóa register sẽ khai báo biến nằm ở trên register của CPU thay vì nằm trên memory.
Giống như biến auto, biến register cũng được sử dụng bên trong các hàm, nó sẽ được nằm trực tiếp trên register của CPU thay vì bộ nhớ stack như biến auto.
Đối với C thì từ khóa này cũng hiếm khi sử dụng, còn với C++ thì nó không còn được hỗ trợ trong C++11, vì vậy chúng ta không nên sử dụng nó.
👉 Thread Local Storage
Thread Local Storage - tiếng việt là Lưu trữ cục bộ theo luồng, được hiểu là một cơ chế trong đó các biến được phân bổ sao cho có một phiên bản của biến trên mỗi thread đang có.
Từ khóa sử dụng thread_local.
Keyword này sẽ được giới thiệu sau khi chúng ta tìm hiểu về multithread.
>>>= Follow ngay =<<<