🌱 C++ Storage Class - Lớp lưu trữ trong C++

🌱 C++ Storage Class - Lớp lưu trữ trong C++

Tất cả các biến trong C++ đều có hai đặc điểm: Data TypeStorage Class.

    Khái niệm Data Type - Kiểu dữ liệu đã được giới thiệu ở những bài trước. Còn khái niệm Storage Class trong C++ cũng gần tương tự như Storage Class trong C.

    Storage Class - Lớp lưu trữ, là khái niệm định nghĩa thời gian tồn tại (lifetime), và phạm vi hoạt động (scope) của các biến.

    Tùy thuộc vào lớp lưu trữ của một biến, nó có thể được chia thành 4 loại chính:

  • Biến cục bộ - Local Variable
  • Biến toàn cục - Global Variable
  • Biến tĩnh - Static Variable
  • Register Variable
  • Thread Local Storage

    👉 Local Variable - Biến cục bộ

    Một biến được khai báo bên trong một hàm, được gọi là biến cục bộ - local variable, hoặc auto variable.

ScopeChỉ được truy cập từ bên trong hàm
LifetimeTồ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;
}

    Biến var là một biến local trong hàm test(), và var1 là biến local trong hàm main().

    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.

ScopeSử dụng cho toàn bộ chương trình
Bất kỳ vị trị nào sau khi khai báo
LifetimeTừ 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;
}

    Run This Code    

    ➥ 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()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.

ScopeChỉ được truy cập từ bên trong hàm
LifetimeTừ 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;
}

    Run This Code    

    ➥ 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 =<<<

Để nhận được những bài học miễn phí mới nhất nhé 😊

Chúc các bạn học tập tốt 😊

                                        

Nguyễn Văn Nghĩa

Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

Đăng nhận xét

Mới hơn Cũ hơn