2010-03-02 56 views
55

thể trùng lặp:
C++: What is the size of an object of an empty class?Tại sao kích thước của một lớp trống trong C++ không phải là 0?

Tại sao đầu ra sau đây 1?

#include <iostream> 

class Test 
{ 
}; 

int main() 
{ 
    std::cout << sizeof(Test); 
    return 0; 
} 
+4

Có một thành phần giữ chỗ giả có kích thước xảy ra là một byte. Vì đối với một mảng Kiểm tra [10], mỗi đối tượng phải có một địa chỉ duy nhất. – legends2k

+4

Một tối ưu hóa thú vị mặc dù là 'Tối ưu hóa cơ sở trống ', có nghĩa là nếu bạn kế thừa từ một lớp cơ sở trống (không có thuộc tính, không có phương thức ảo), thì kích thước lớp học của bạn sẽ không phát triển. Có một số (khác) điều kiện, nhưng nó giải thích lý do tại sao tư nhân kế thừa từ các vị từ trong một số trường hợp. –

+0

[câu hỏi tương tự 1] (http://stackoverflow.com/questions/1626446) và [câu hỏi tương tự 2] (http://stackoverflow.com/questions/621616/). – Lazer

Trả lời

86

Tiêu chuẩn không cho phép các đối tượng (và các lớp của chúng) có kích thước 0, do đó có thể làm cho hai đối tượng riêng biệt có cùng địa chỉ bộ nhớ. Đó là lý do tại sao các lớp trống phải có kích thước (ít nhất) 1.

+2

Hm ... nhưng không nên người liên kết có thể quan tâm đến điều đó bất kể sizeof() trả về cái gì? Điều này không giống như một tác dụng phụ? Tôi hiểu những gì bạn đang nói, nhưng không phải là nó hoàn toàn khả thi để trả về 0 cho sizeof (Test). Nhưng nếu tiêu chuẩn nói như vậy, nó nói như vậy. Trên thực tế một điều tốt cho một lần để được rõ ràng thay vì cố ý mơ hồ về một chủ đề. –

+12

@Kích hoạt, vậy điều gì sẽ 'Thử nghiệm [10];' có kích thước? Và 'sizeof a/sizeof * a' sẽ chia cho 0. Và' for (Test * i = a; i! = A + 10; i ++) f (i); 'cũng sẽ không hoạt động. Tôi tin rằng nó sẽ gây ra rất nhiều vấn đề, vì bạn cần rất nhiều trường hợp đặc biệt trong trình biên dịch * và * trong mã người dùng. –

+0

@Johannes, đúng vậy. Tôi không nghĩ về điều đó. –

27

Để đảm bảo rằng địa chỉ của hai đối tượng khác nhau sẽ khác nhau. Vì lý do tương tự, "mới" luôn luôn trả về con trỏ cho các đối tượng riêng biệt.

Xem Stroustrup để có câu trả lời đầy đủ.

+1

Chuyển đến liên kết trang trực tiếp –

20

Chuẩn C++ đảm bảo rằng kích thước của bất kỳ lớp nào là ít nhất một. Chuẩn C++ nói rằng không có đối tượng nào có cùng địa chỉ bộ nhớ với một đối tượng khác. Có một số lý do chính đáng cho việc này.

  1. Để đảm bảo rằng new sẽ luôn trả về con trỏ đến địa chỉ bộ nhớ riêng biệt.

  2. Để tránh một số bộ phận bằng không. Ví dụ, con trỏ arithmetics (nhiều trong số đó được thực hiện tự động bởi trình biên dịch) liên quan đến việc chia cho sizeof(T).

Lưu ý tuy nhiên nó không có nghĩa là một cơ sở hạng trống sẽ bổ sung từ 1 tới kích thước của một lớp có nguồn gốc:

struct Empty { }; 

struct Optimized : public Empty { 
    char c; 
}; 

// sizeof(Optimized) == 1 with g++ 4.0.1 

Bjarne Stroustrup talks about this quá.

+2

Số học con trỏ nào liên quan đến _dividing_ bởi 'sizeof (T)'? Tôi không thể nghĩ ra một ví dụ nào. Plase thêm ít nhất một ví dụ. – MSalters

+4

@MSalters: lặp qua các mảng của các phần tử thuộc loại T. – wilhelmtell

+1

@MSalters: trừ hai con trỏ trả về số lượng phần tử, không phải số byte, ở giữa. –

3

Những gì Maurits và Péter nói.

Thật là thú vị cần lưu ý trong bối cảnh này mà trình biên dịch có thể làm rỗng tối ưu hóa lớp cơ sở (EBCO):

#include <iostream> 
struct Foo {}; 
struct Bar : Foo {}; 
int main() { 
    std::cout << sizeof(Foo) << ',' << sizeof(Bar) << std::endl;   
} 

Điều này có lẽ sẽ in "1,1" nếu bạn biên dịch và chạy nó. Xem thêm Vandevoorde/Josuttis 16.2 trên EBCO.

9

Lớp không có bất kỳ thành viên dữ liệu nào và hàm thành viên loại lớp đó được gọi là lớp trống. Kích thước của đối tượng của lớp trống luôn là 1 byte.

Khi chúng tôi tạo đối tượng của bất kỳ lớp nào tại đối tượng thời gian đó luôn nhận được 3 đặc điểm, tức là

  1. Nhà nước
  2. Behavior
  3. nhận dạng

Khi chúng ta tạo ra đối tượng của lớp trống tại thời điểm đó Nhà nước của đối tượng đó là gì. Hành vi của đối tượng đó cũng không là gì, nhưng trình biên dịch gán một địa chỉ duy nhất cho đối tượng đó. Bộ nhớ trong Máy tính luôn được sắp xếp theo dạng byte và bộ nhớ tối thiểu có sẵn tại vị trí địa chỉ đối tượng là 1 byte. Đó là lý do tại sao kích thước của đối tượng của lớp trống là 1 byte.

+0

nếu bất kỳ ai muốn knt abt 3 charecteristics của một đối tượng tức là 1) Nhà nước 2) Hành vi 3) Nhận dạng rồi hỏi tôi – Shantanu

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