Chi tiết bài học Lớp lưu trữ trong C++

Lớp lưu trữ trong C++

Trong bài này, bạn sẽ được học về những lớp tàng trữ khác nhau trong C + +. Bao gồm : local ( cục bộ ), global ( toàn cục ), static local ( static cục bộ ), register ( thanh ghi ) và thread local ( cục bộ luồng ) .

Mỗi biến trong C++ có hai đặc trưng: kiểu và lớp lưu trữ.

Kiểu chỉ ra dạng tài liệu sẽ được lưu trong một biến. Ví dụ : int, float, char …
Và lớp tài liệu tinh chỉnh và điều khiển hai đặc tính khác của một biến : thời hạn sống sót ( quyết định hành động một biến hoàn toàn có thể sống sót trong bao lâu ) và khoanh vùng phạm vi ( quyết định hành động phần nào của chương trình hoàn toàn có thể truy vấn ) .
Tùy theo lớp tàng trữ của một biến, nó hoàn toàn có thể được phân thành 4 kiểu chính :

  • Biến cục bộ ( Local variable )

  • Biến toàn cục ( Global variable )

  • Biến cục bộ static ( Static local variable )

  • Biến thanh ghi ( Register variable )

  • Lưu trữ cục bộ trên luồng ( Thread local storage )

Biến cục bộ

Một biến được định nghĩa bên trong một hàm ( định nghĩa trong thân hàm, giữa hai dấu ngoặc nhọn ) được gọi là biến cục bộ hoặc biến tự động hóa .
Phạm vi của nó chỉ số lượng giới hạn cho hàm mà nó được định nghĩa. Nói cách khác, biến cục bộ chỉ sống sót và truy vấn được bên trong một hàm .
Thời gian sống sót của biến cục bộ kết thúc ( bị hủy ) khi hàm kết thúc .

Ví dụ 1: biến cục bộ

#include 
using namespace std;

void test();

int main() 
{
    // biến cục bộ của hàm main()
    int var = 5;

    test();
    
    // không hợp lệ: var1 không được định nghĩa trong main()
    var1 = 9;
}

void test()
{
    // biến cục bộ của hàm test()
    int var1;
    var1 = 6;

    // không hợp lệ: var không được định nghĩa trong test()
    cout << var;
}

Biến var không hề được sử dụng trong hàm test ( ) và var1 không hề sử dụng trong hàm main ( ) .
Từ khóa auto cũng hoàn toàn có thể được sử dụng để định nghĩa biến cục bộ : auto int var ;
Nhưng từ sau C + + 11, auto có ý nghĩa khác và không nên sử dụng để định nghĩa biến cục bộ .

Biến toàn cục

Nếu một biến được định nghĩa ngoài toàn bộ những hàm, nó sẽ được gọi là biến toàn cục .

Phạm vi của biến toàn cục là toàn bộ chương trình. Nghĩa là nó có thể được sử dụng và thay đổi tại bất kỳ phần nào của chương trình sau khi đã được khai báo.

Thêm vào đó, thời hạn sống sót của nó chỉ kết thúc khi chương trình dừng .

Ví dụ 2: Biến toàn cục

#include 
using namespace std;

// Khai báo biến toàn cục
int c = 12;

void test();

int main()
{
    ++c;

    // đầu ra là 13
    cout << c <

Đầu ra

13

14

Trong chương trình trên, c là một biến toàn cục .
Biến này hoàn toàn có thể được truy xuất bởi cả hàm main ( ) và test ( ) trong chương trình trên .

Biến cục bộ static

Từ khóa static được dùng để xác lập một biến static. Ví dụ :

... .. ...
int main()
{
   static float a;
   ... .. ...
}

Biến cục bộ static chỉ sống sót trong hàm mà nó được khai báo ( giống với biến cục bộ ) nhưng thời hạn sống sót của nó là từ khi hàm được gọi cho tới khi chương trình kết thúc .
Sự độc lạ lớn nhất giữa biến cục bộ và biến static đó là giá trị của biến static sẽ được giữ nguyên cho tới khi chương trình kết thúc .

Ví dụ 3: Biến cục bộ static

#include 
using namespace std;

void test()
{
    // var là một biến static
    static int var = 0;
    ++var;

    cout << var << endl;
}

int main()
{
    
    test();
    test();

    return 0;
}

Đầu ra

1

2

Trong chương trình trên, hàm test ( ) được gọi 2 lần .
Trong lần gọi tiên phong, biến var được khai báo là một biến static và được khởi tạo bằng 0. Sau đó 1 được cộng thêm vào var và được hiển thị trên màn hình hiển thị .
Khi hàm test ( ) trả về, biến var vẫn sống sót vì nó là một biến static .
Trong lần gọi thứ hai, không có biến var mới nào được tạo. Biến var trước đó được tăng lên 1 và hiển thị ra màn hình hiển thị .

Đầu ra của chương trình trên nếu var không được khai báo là biến static

1

1

Biến thanh ghi (đã không còn trong C++11)

Từ khóa register được sử dụng để xác lập biến thanh ghi .
Biến thanh ghi tương tự như với biến tự động hóa và chỉ sống sót bên trong một hàm đơn cử. Nó được cho là nhanh hơn so với biến cục bộ .
Nếu một chương trình phát hiện một biến thanh ghi, nó sẽ lưu biến vào trong thanh thi của vi giải quyết và xử lý chứ không phải là trong bộ nhớ nếu hoàn toàn có thể. Điều này giúp nó sẽ được giải quyết và xử lý nhanh hơn so với biến cục bộ .

Tuy nhiên, từ khóa này đã không còn trong C++11 và không nên sử dụng.

Lưu trữ cục bộ theo luồng

Lưu trữ cục bộ theo luồng là một chính sách mà ở đó những biến được cấp phép theo hướng chỉ có một thực thể biến so với mỗi luồng đang có .
Từ khóa thread_local được sử dụng cho mục tiêu này .