Giả sử tôi có một lớp và tôi có một thành viên tĩnh trong đó, nhưng tôi không tạo bất kỳ đối tượng nào thuộc loại đó. Bộ nhớ có bị chiếm giữ cho biến tĩnh không? Nếu nó bị chiếm đóng, điểm của việc đưa nó vào một lớp là gì?Làm các thành viên tĩnh của một lớp chiếm bộ nhớ nếu không có đối tượng của lớp đó được tạo ra?
Trả lời
No.
thành viên tĩnh không thuộc về các phiên bản của lớp học. chúng không tăng số lượng cá thể và kích cỡ lớp thậm chí 1 bit!
struct A
{
int i;
static int j;
};
struct B
{
int i;
};
std::cout << (sizeof(A) == sizeof(B)) << std::endl;
Output:
1
Đó là, kích thước của A
và B
là chính xác như vậy. các thành viên tĩnh giống như các đối tượng toàn cầu được truy cập thông qua A::j
.
Xem trình diễn tại ideone: http://www.ideone.com/YeYxe
$ 9.4.2/1 từ C++ Standard (2003),
Một thành viên dữ liệu tĩnh không phải là một phần của các subobjects của một lớp học. Có chỉ một bản sao của thành viên dữ liệu tĩnh được chia sẻ bởi tất cả các đối tượng của lớp .
$ 9.4.2/3 và 7 từ Standard,
một lần các thành viên dữ liệu tĩnh đã xác định, nó tồn tại ngay cả khi không có đối tượng của lớp của nó đã được tạo ra.
thành viên dữ liệu tĩnh được khởi tạo và phá hủy chính xác như phi địa phương đối tượng (3.6.2, 3.6.3).
Như tôi đã nói, các thành viên tĩnh giống với các đối tượng toàn cầu hơn!
Tiêu chuẩn C++ không thể hiện rõ ràng khi bộ nhớ tĩnh được cấp phát, miễn là nó có sẵn khi sử dụng lần đầu tiên. Điều đó nói rằng, nó rất có thể được phân bổ trong quá trình khởi tạo chương trình, do đó đảm bảo sự hiện diện của nó ngay khi nó được yêu cầu, mà không cần mã đặc biệt để phát hiện và thực hiện phân bổ khi truy cập.
Mục đích của việc đưa dữ liệu tĩnh vào một lớp giống như đặt bất kỳ dữ liệu nào khác vào lớp học. Bằng cách đưa dữ liệu vào một cấu trúc lớp, bạn đang định nghĩa một không gian tên đóng gói, cũng như có thể kiểm soát truy cập bằng cách sử dụng các phương thức accessor và mutator; điều này, đến lượt nó, sẽ cho phép bạn xác nhận hợp lệ dữ liệu đi vào kho lưu trữ bộ nhớ tĩnh, và để đảm bảo tính nhất quán trong suốt quá trình sử dụng dữ liệu này.
Thực ra, tôi nghĩ tiêu chuẩn đối xử với các thành viên tĩnh như tất cả các hình cầu, và sự tiến bộ của họ được gửi đi, theo như tôi hiểu, với cùng một định luật rằng sự tiến hóa của các hình cầu khác. Đó là thứ tự khởi tạo được yêu cầu phải nhất quán trong một đơn vị dịch và không có gì nói về việc ghép kênh với các đơn vị dịch thuật khác. –
Biến tĩnh được lưu trữ trong vùng bộ nhớ đặc biệt được gọi là BSS, trong khi các phiên bản của một lớp được lưu trữ trong một đống hoặc trên một ngăn xếp. Vì vậy, các thành viên tĩnh được lưu trữ riêng biệt.
Thực ra, sự tồn tại của BSS phụ thuộc vào hệ thống. Tiêu chuẩn C++ không xác định bất kỳ con thú nào như vậy, cũng không phải bất kỳ chi tiết nào về việc triển khai phân bổ dữ liệu. –
- 1. Thành viên lớp học có chiếm được bộ nhớ không?
- 2. Khởi tạo các thành viên tĩnh của một lớp templated
- 3. Các thành viên tĩnh của một lớp thể hiện
- 4. C# - làm thế nào để truy cập một thành viên tĩnh của lớp, được đưa ra một thể hiện của lớp đó?
- 5. khởi In-lớp của các thành viên dữ liệu tĩnh
- 6. Lớp học không có thành viên dữ liệu có dấu chân bộ nhớ trong java không?
- 7. Các thành viên tĩnh của các lớp chung được chia sẻ giữa các loại
- 8. Sử dụng bộ nhớ Python: Đối tượng nào của tôi đang chiếm nhiều bộ nhớ nhất?
- 9. Các thành viên lớp tĩnh python
- 10. Các thành viên tĩnh của một lớp chung có gắn với cá thể cụ thể không?
- 11. Tham chiếu đối tượng có chiếm thêm bộ nhớ không?
- 12. Trong Java, các thành viên lớp tĩnh có được chia sẻ giữa các chương trình không?
- 13. Tại sao không có khái niệm "const-correctness" cho các hàm thành viên tĩnh của lớp?
- 14. Các thành viên tĩnh có giúp hiệu quả bộ nhớ không?
- 15. Lớp thành viên tĩnh - khai báo lớp riêng tư và lớp thành viên riêng tư?
- 16. Có thể một thành viên của một lớp được đặt tên giống với tên của nó (lớp khác) không?
- 17. Lớp Singleton so với lớp có thành viên tĩnh
- 18. Tại sao các đối tượng thành viên được khởi tạo sau hàm tạo của lớp siêu hạng?
- 19. khi nào thành viên tĩnh nhận được bộ nhớ
- 20. Việc tạo một thể hiện của một lớp con có tự động tạo đối tượng siêu lớp của nó không?
- 21. Tại sao một lớp được phép có một thành viên tĩnh của chính nó, nhưng không phải là một thành viên không tĩnh?
- 22. Điều gì là sai khi sử dụng một đối tượng thành viên tĩnh với một lớp?
- 23. Tạo một lớp PHP -> Tạo một đối tượng của nó trong một lớp khác
- 24. Thành viên lớp học "tĩnh"
- 25. Thứ tự của các thành viên của các đối tượng trong lớp có ảnh hưởng gì đến hiệu suất không?
- 26. Tham chiếu đối tượng tĩnh được tạo trong một lớp trong toàn bộ ứng dụng
- 27. Bản đồ bộ nhớ đối tượng lớp C++
- 28. Gọi hàm từ tệp Lớp mà không tạo đối tượng của lớp đó
- 29. Chỉ định một hàm thành viên của lớp làm bạn của một lớp khác?
- 30. liên kết bộ nhớ của các lớp
+1 để liên kết đến các định nghĩa từ tiêu chuẩn, về cơ bản vạch ra câu trả lời trong bê tông. – dcousens
Cảm ơn rất nhiều thông tin –