2010-10-12 25 views
8

Về cơ bản nó là một theo dõi của this question ..Tại sao các lớp cơ sở có thể có kích thước bằng 0?

Khi tôi nhìn vào tài liệu Chuẩn Tôi thấy điều này ..

Trong Lớp 9,3,

đối tượng Toàn và thành viên subobjects của loại lớp phải có kích thước không phải là. 96) ...

Yeah, đúng .. Nhưng,

96) subobjects lớp cơ sở là không quá hạn chế.

Vì vậy, khi tôi nhìn vào Stroustrup's FAQ, có một ví dụ như

void f(X* p) 
    { 
     void* p1 = p; 
     void* p2 = &p->a; 
     if (p1 == p2) cout << "nice: good optimizer"; 
    } 

Câu hỏi của tôi là tôi không thể hiểu nó như thế nào là tối ưu và cũng lý do tại sao các lớp cơ sở được phép có kích thước bằng không?

+4

Tôi nghĩ điều này có nghĩa là lớp cơ sở trống * đóng góp * không có kích thước bổ sung cho lớp dẫn xuất. Nếu bạn khởi tạo một lớp cơ sở trống, nó sẽ vẫn có kích thước tối thiểu là 1. –

+0

@Paul R: bạn không thể thực sự khởi tạo một lớp _base_ lớp cơ sở trống theo định nghĩa là các phần không thể tách rời của một kiểu khác. Xem thêm định nghĩa rõ ràng hơn của Armen Tsirunyan. – MSalters

+0

Tôi tự hỏi kích thước này bằng 0 và tất cả những thứ như thế cần thiết. –

Trả lời

11

Lớp cơ sở không thể có kích thước bằng 0. Chỉ có lớp cơ sở subobjects có thể. Có nghĩa là phần cơ sở của đối tượng dẫn xuất.

+0

+1, đơn giản và rõ ràng ... :) – liaK

10

Nếu lớp cơ sở trống, bạn sẽ không bao giờ cần phải có đối tượng lớp cơ sở hoặc bất kỳ địa chỉ nào của thành viên (độc lập với địa chỉ của đối tượng lớp dẫn xuất), vì vậy sẽ hợp pháp để tối ưu hóa kích thước của nó .

Điều đó tiết kiệm cho bạn (ít nhất) một byte bộ nhớ (có thể nhiều hơn do quy tắc liên kết bộ nhớ), có thể tiết kiệm đáng kể nếu bạn có hàng triệu đối tượng như vậy trong ứng dụng của bạn trên nền tảng hạn chế bộ nhớ.

+0

Vâng .. Cảm ơn .. :) – liaK

0

Tôi không phải là Raymond Chen, nhưng tôi có thể chơi trò chơi 'nếu nó là sự thật'.

Nếu một lớp có thể được truyền dưới dạng tham chiếu có thể bằng 0, thì tại một thời điểm nào đó, nó có thể được chuyển đến malloc(0), có thể trả về NULL hoặc địa chỉ không thể chấp nhận. Sau đó, hai trường hợp có thể xuất hiện bằng nhau khi họ không nên.

Nếu tuy nhiên nó là thành viên của một lớp khác hoặc một lớp cơ sở, địa chỉ và kích thước của nó bắt nguồn từ vị trí của nó trong phân bổ lớp chứa và an toàn cho nó là không có kích thước.

Và có kích thước bằng không tốt cho hiệu quả bộ nhớ.

+0

"Nếu tuy nhiên nó là thành viên của lớp khác, địa chỉ và kích thước của nó bắt nguồn từ vị trí của nó trong phân bổ lớp chứa, và an toàn cho nó có kích thước bằng không. " Một subobect thành viên không thể có kích thước bằng không. Chỉ có lớp phụ cơ sở –

+0

@Amen Tsirunyan, thú vị; tại sao? Để bảo tồn macro FOFF? – Will

+0

Không chắc chắn TẠI SAO, nhưng các tiêu chuẩn là rõ ràng về mặt này. Nhưng đó là một điểm tốt, tôi sẽ cho nó một số suy nghĩ, có thể nó có liên quan đến con trỏ đến các thành viên ... –

0

Đó là một tối ưu hóa vì các trường hợp của lớp dẫn xuất chiếm ít không gian hơn chúng sẽ có, nếu lớp con lớp cơ sở được yêu cầu phải có kích thước khác 0. Nó có nghĩa là các lớp cơ sở như các giao diện, hoặc các hỗn hợp, hoặc các lớp chính sách được tạo khuôn mẫu, không làm tăng kích cỡ của các lớp thực hiện hoặc sử dụng chúng. Cuối cùng, chương trình của bạn cần ít bộ nhớ hơn để làm điều tương tự.

Tôi không chắc chắn về lịch sử, nhưng ấn tượng tôi nhận được là đôi khi trong thập niên 1990, một số trình biên dịch bắt đầu thực hiện nó và ủy ban tiêu chuẩn đã quyết định chuẩn hóa thực hành hiện tại. Tôi nghĩ rằng sự gia tăng của các đối tượng cấp phát trong các mẫu STL là một phần của lý do - một số std::vector thường là kích thước của 3 con trỏ với tối ưu hóa cơ sở trống và 4 con trỏ không có nó (do căn chỉnh). Here's an article từ năm 1997 thảo luận về nó - nó rõ ràng rằng nó không phải là tất cả những gì phổ biến khi đã được viết, nhưng nó về cơ bản thực hành tiêu chuẩn bây giờ.

0

Kích thước của một đối tượng không là gì ngoài kích thước tích lũy của các thành viên đó. Và KHÔNG, không có lớp nào có thể có kích thước bằng không, ngay cả một lớp trống sẽ có kích thước là 1 byte.

nghĩa là gì đây bởi

Base class subobjects are not so constrained.

là các đối tượng chính nó sẽ không tiêu thụ bất kỳ không gian chứ không phải đó là các thành viên sẽ. Vì vậy, địa chỉ của một đối tượng có thể khớp với địa chỉ của thành viên đầu tiên của nó, giống như trong trường hợp của arrays. Đó là tối ưu hóa.

Trong trường hợp lớp dẫn xuất, nó nhất thiết sẽ bao gồm đối tượng lớp cơ sở, thậm chí trống sẽ tiêu thụ 1 byte, do đó tối ưu hóa ở trên không hợp lệ đối với lớp dẫn xuất.

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