2013-02-22 38 views
12

Tôi tạo ra một lớp X chỉ có 2 chức năng công cộng (constructor và destructor), và sử dụng sizeof điều hành kích thước lớp đang đến là 1.Toán tử C++ sizeof tính kích thước như thế nào?

Khi tôi thêm một thành viên dữ liệu cá nhân của loại char để khai báo lớp trên , kích thước vẫn là 1. Cuối cùng tôi thêm một loại số nguyên vào nó như là một thành viên dữ liệu lớp, và bây giờ kích thước là 8 byte.

Vui lòng giải thích cho tôi cách tính kích thước lớp học.

+0

Hãy gửi mã có liên quan. –

Trả lời

23

Đầu tiên, nhận ra rằng các hàm không ảo không ảnh hưởng đến kích thước của một lớp.

Kích thước của một phiên bản bất kỳ lớp nào ít nhất là 1 byte, ngay cả khi lớp trống, để các đối tượng khác nhau có địa chỉ khác nhau.

Thêm char đảm bảo rằng các đối tượng khác nhau sẽ có các địa chỉ khác nhau, do đó trình biên dịch không thêm nhân tạo vào kích thước một cách giả tạo. Kích thước sau đó là sizeof(char) = 1.

Sau đó, bạn thêm int, trong đó (có thể) thêm 4 byte trên nền tảng của bạn. Trình biên dịch sau đó quyết định pad lớp để nó sẽ được sắp xếp cho các lý do hiệu suất/CPU-yêu cầu, và thêm 3 byte trống để kích thước bây giờ là 1 + 3 + 4 = 8. Nó có thể thêm phần đệm trước thành viên int rằng nó sẽ được căn chỉnh trên một ranh giới 4 byte, nhưng nó không cần thiết trừ khi CPU của bạn yêu cầu nó.

Bạn có thể đọc về phần đệm trên the Wikipedia page.

+2

Tôi cho rằng nó sẽ là 'c --- iiii' hơn là' ciiii --- ', như câu trả lời này ngụ ý. – zch

+4

@zch Tôi không ngụ ý rằng nó phụ thuộc vào trình biên dịch. Nhưng tôi sẽ thay đổi thứ tự của việc bổ sung và thêm một lưu ý nếu nó làm cho nó có vẻ ít gây nhầm lẫn. –

+0

cảm ơn rất nhiều @SethCarnegie cho lời giải thích.Tôi biết một chút về padding, sẽ đào sâu hơn vào nó như tôi có một nghi ngờ rằng tại sao không có padding khi chỉ có một char được khai báo ngay cả khi ranh giới là 4 byte. :) – user2100866

8

Có nhiều yếu tố quyết định kích thước của đối tượng của lớp trong C++. Những yếu tố này bao gồm:

  1. Kích thước của tất cả các thành viên dữ liệu không tĩnh
  2. thứ tự của các thành viên dữ liệu
  3. Byte liên kết hoặc byte đệm
  4. Kích thước của lớp cơ sở ngay lập tức nó
  5. Sự tồn tại của chức năng ảo (s) (Đa hình động sử dụng các chức năng ảo).
  6. biên dịch được sử dụng
  7. Phương thức thừa kế (thừa kế ảo)

Bạn có thể tìm thấy ở đây nhiều http://www.cprogramming.com/tutorial/size_of_class_object.html

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