Lớp lưu trữ C++

Trong bài viết này, bạn sẽ tìm hiểu về các lớp lưu trữ khác nhau trong C ++. Cụ thể: local, global, static local, register và thread local.

Mọi biến trong C ++ đều có hai tính năng: kiểu và lớp lưu trữ.

Kiểu chỉ định kiểu dữ liệu có thể được lưu trữ trong một biến. Ví dụ: intfloatchar, vv

Và, lớp lưu trữ kiểm soát hai thuộc tính khác nhau của một biến: thời gian tồn tại (xác định thời gian tồn tại của biến) và phạm vi (xác định phần nào của chương trình có thể truy cập 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:

  • Local variable
  • Global variable
  • Static local variable
  • Register Variable
  • Thread Local Storage

Biến cục bộ

Một biến được xác định bên trong một hàm (được xác định bên trong thân hàm giữa các dấu ngoặc nhọn) được gọi là biến cục bộ hoặc biến tự động.

Phạm vi của nó chỉ giới hạn trong chức năng mà nó được xác định. Nói một cách dễ hiểu, biến cục bộ tồn tại và chỉ có thể được truy cập bên trong một hàm.

Tuổi thọ của một biến cục bộ kết thúc (Nó bị hủy) khi hàm thoát.

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

#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 không thể được sử dụng bên trong test()và var1 không thể được sử dụng bên trong main()hàm.

Từ khóa autocũng được sử dụng để xác định các biến cục bộ trước đây như:auto int var;

Tuy nhiên, sau C ++ 11auto có một ý nghĩa khác và không nên được sử dụng để xác định các biến cục bộ.

Biến toàn cầu

Nếu một biến được định nghĩa bên ngoài tất cả các hàm, thì nó được gọi là biến toàn cục.

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

Tương tự như vậy, vòng đời của nó chỉ kết thúc khi chương trình kết thúc.

Ví dụ 2: Biến toàn cụ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;
}

Đầ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 hiển thị cho cả hàm main()và test()trong chương trình trên.

Biến cục bộ tĩnh

Từ khóa staticđược sử dụng để chỉ định một biến tĩnh. Ví dụ:

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

Biến cục bộ tĩnh chỉ tồn tại bên trong một hàm mà nó được khai báo (tương tự như biến cục bộ) nhưng thời gian tồn tại của nó bắt đầu khi hàm được gọi và chỉ kết thúc khi chương trình kết thúc.

Sự khác biệt chính giữa biến cục bộ và biến tĩnh là giá trị của biến tĩnh vẫn tồn tại ở cuối chương trình.

Ví dụ 3: Biến cục bộ tĩnh

#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;
}

Đầu ra

1
2

Trong chương trình trên, test()hàm được gọi 2 lần.

Trong lần gọi đầu tiên, biến var được khai báo là biến tĩnh và được khởi tạo bằng 0. Sau đó, 1 được thêm vào var được hiển thị trên màn hình.

Khi hàm test () trả về, biến var vẫn tồn tại vì nó là một biến tĩnh.

Trong lần gọi hàm thứ hai, không có biến var mới nào được tạo. Cùng một var được tăng lên 1 và sau đó hiển thị ra màn hình.

Đầu ra của chương trình trên nếu varkhông được chỉ định là biến tĩnh

1
1

Đăng ký biến (Không được dùng trong C ++ 11)

Từ khóa registerđược sử dụng để chỉ định các biến đăng ký.

Các biến thanh ghi tương tự như các biến tự động và chỉ tồn tại bên trong một hàm cụ thể. Nó được cho là nhanh hơn các biến cục bộ.

Nếu một chương trình gặp một biến thanh ghi, nó sẽ lưu trữ biến đó trong thanh ghi của bộ xử lý chứ không phải trong bộ nhớ nếu có. Điều này làm cho nó nhanh hơn các biến cục bộ.

Tuy nhiên, từ khóa này không được chấp nhận trong C ++ 11 và không nên được sử dụng.

Bộ nhớ cục bộ của chuỗi

Lưu trữ cục bộ luồng là một cơ chế mà các biến được cấp phát sao cho có một phiên bản của biến trên mỗi luồng còn tồn tại.

Từ khóa thread_localđược sử dụng cho mục đích này.

Tìm hiểu thêm về lưu trữ cục bộ của chuỗi .









Gõ tìm kiếm nhanh...