2011-12-15 32 views
9

Tôi đã tự hỏi giới hạn kích thước của lớp là bao nhiêu. Tôi đã làm một thử nghiệm đơn giản:Giới hạn kích thước cho một lớp học là bao nhiêu?

#define CLS(name,other) \ 
class name\ 
{\ 
public: \ 
name() {};\ 
    other a;\ 
    other b;\ 
    other c;\ 
    other d;\ 
    other e;\ 
    other f;\ 
    other g;\ 
    other h;\ 
    other i;\ 
    other j;\ 
    other k;\ 
}; 

class A{ 
    int k; 
public: 
    A(){}; 
}; 

CLS(B,A); 
CLS(C,B); 
CLS(D,C); 
CLS(E,D); 
CLS(F,E); 
CLS(G,F); 
CLS(H,G); 
CLS(I,H); 
CLS(J,I); 

Nó không biên dịch với

" 'J': lớp là quá lớn"

Nếu tôi loại bỏ các tuyên bố chính thức - CLS(J,I);, nó tất cả các biên dịch đều tốt.

Đây có phải là hạn chế do trình biên dịch áp đặt hay là một nơi nào đó trong tiêu chuẩn?

+0

Với xác định cuối cùng bạn đạt khoảng 10 GB (tùy thuộc vào vùng đệm) cho lớp J. – dalle

+0

Tôi vừa tuyên bố nó, không thực sự sử dụng nó.Tôi đặt cược tuyên bố một mảng của một số lớp H sẽ phá vỡ thời gian chạy :) –

Trả lời

14

Trong C++ 11 này là Phụ lục B. Triển khai có thể áp đặt giới hạn, nhưng họ nên có ít nhất:

  • Kích thước của một đối tượng [262 144].
  • Thành viên dữ liệu trong một lớp duy nhất [16 384].
  • Thành viên được khai báo trong một lớp duy nhất [4 096].

Người thứ ba không liên quan trực tiếp đến việc xây dựng loại bạn đang sử dụng, tôi đề cập đến nó chỉ vì nó chỉ ra rằng một giây thực sự là tổng thành viên, có lẽ kể cả những người trong căn cứ và tôi 'không chắc chắn về thành viên của các thành viên. Nhưng nó không chỉ là về các thành viên được liệt kê trong một định nghĩa lớp duy nhất.

Triển khai của bạn dường như đã từ bỏ 2^31 thành viên dữ liệu hoặc ở kích thước 2^32, vì nó chấp nhận I nhưng không phải là J. Nó khá rõ ràng là hợp lý cho một trình biên dịch từ chối xem xét các lớp học có kích thước lớn hơn SIZE_MAX, ngay cả khi chương trình xảy ra không khởi tạo nó hoặc sử dụng sizeof trên loại. Vì vậy, ngay cả với những nỗ lực tốt nhất có thể trên một phần của trình biên dịch tôi sẽ không bao giờ mong đợi điều này để làm việc trên một thực hiện 32 bit. Lưu ý rằng "những đại lượng này chỉ là hướng dẫn và không xác định sự tuân thủ", vì vậy một hàm ý phù hợp có thể áp đặt giới hạn nhỏ hơn tùy ý ngay cả khi nó có đủ tài nguyên để biên dịch chương trình sử dụng số lớn hơn. Không có giới hạn tối thiểu cho sự phù hợp.

Có nhiều cơ hội khác nhau trong tiêu chuẩn C++ cho việc triển khai phù hợp để vô ích do giới hạn tài nguyên nhỏ, vì vậy không có thêm tác hại nào nếu đây là một vấn đề khác.

C++ 03 là hơn hoặc ít hơn như nhau:

  • Kích thước của một đối tượng [262 144].
  • Thành viên dữ liệu trong một lớp, cấu trúc hoặc công đoàn đơn lẻ [16 384].
  • Thành viên được khai báo trong một lớp duy nhất [4 096].
+0

Hoàn hảo, cảm ơn bạn. –

+0

@Steve Jessop. Lưu ý rằng Phụ lục B không phải là tiêu chuẩn --- các giá trị được đưa ra có mức tối thiểu được đề nghị và thực tế, tôi sẽ rất ngạc nhiên nếu hệ thống 16 bit hỗ trợ một lớp với kích thước lớn hơn 65565. –

+0

@James: vâng, Tôi đã lưu ý điều đó. Điểm tốt khoảng 16 bit, bạn mong đợi 'SIZE_MAX' nhỏ hơn giới hạn được đề xuất. –

0

Tôi chắc chắn rằng trình biên dịch của nó phụ thuộc. Bạn có thể chạy trình biên dịch của bạn trong một chế độ tiền xử lý chỉ để xem đầu ra được tạo ra là gì nếu bạn tò mò. Bạn cũng có thể muốn xem xét mở rộng mẫu thay vì macro.

+0

Đây chỉ là một câu hỏi lý thuyết thuần túy, đó là lý do tại sao tôi đang sử dụng macro. Tại sao tôi cần mẫu? Ngoài ra, nếu đó là trình biên dịch cụ thể, phải có một số đề cập đến một giới hạn tối thiểu trong tiêu chuẩn. Đó là loại câu trả lời tôi đang tìm kiếm. –

Các vấn đề liên quan