Kích thước của một lớp không có thành viên dữ liệu được trả về là 1 byte, mặc dù có một con trỏ 'this' ẩn này được khai báo. Không nên kích thước trả về là 4 byte (trên một máy 32 bit)? Tôi đã xem các bài báo chỉ ra rằng con trỏ 'này' không được tính để tính kích thước của đối tượng. Nhưng tôi không thể hiểu được lý do cho việc này. Ngoài ra, nếu bất kỳ hàm thành viên nào được khai báo là ảo, kích thước của lớp bây giờ được trả về là 4 byte. Điều này có nghĩa rằng vptr được tính để tính kích thước của đối tượng. Tại sao vptr được xem xét và con trỏ 'this' này bị bỏ qua để tính toán kích thước của đối tượng?Kích thước của một lớp với con trỏ 'này'
Trả lời
Con trỏ this
không phải là thành viên của lớp. Nó chỉ là một cấu trúc được sử dụng trong các phương thức thuộc lớp để tham chiếu đến cá thể hiện tại.
Nếu bạn có một lớp học như thế này:
class IntPair
{
public:
IntPair(int a, int b) : _a(a), _b(b) { }
int sum() const { return _a + _b; }
public:
int _a;
int _b;
};
Lớp này chỉ cần không gian cho hai trường hợp của int
cho mỗi trường hợp. Khi bạn đã tạo một cá thể và đang chạy phương thức sum()
, phương thức đó được gọi với một con trỏ tới cá thể đó, nhưng con trỏ đó luôn xuất phát từ một nơi khác, nó không được lưu trữ trong cá thể đối tượng.
Ví dụ:
IntPair *fib12 = new IntPair(89, 144);
cout << fib12->sum();
Thông báo như thế nào biến đó trở thành con trỏ this
được lưu trữ bên ngoài đối tượng, trong phạm vi đã tạo ra nó.
Bạn có thể, trên thực tế, luôn luôn biến đổi một phương pháp như một ở trên vào:
static int sum2(const IntPair* instance)
{
return instance->_a + instance->_b;
}
Nếu ở trên được định nghĩa bên trong lớp (vì vậy nó có thể truy cập các thành viên tư nhân), không có sự khác biệt. Trên thực tế, này là cách các phương thức được triển khai phía sau hiện trường; con trỏ this
chỉ là một đối số ẩn cho tất cả các phương thức thành viên.
Cuộc gọi sẽ trở thành:
IntPair* fib12 = new IntPair(89, 144);
cout << IntPair::sum2(fib12);
'này' không được lưu trữ như là một thành viên dữ liệu trong lớp, nó chỉ là một 'con trỏ' đến thể hiện của lớp. Xem xét nó như là một 'đối số ẩn' được chuyển cho phương thức. Trong thực tế, trên các hệ thống Win32 nó thường được chuyển trong thanh ghi ecx (không phải là eax như tôi nghĩ ban đầu).
Ngay khi bạn có 1 hoặc nhiều phương pháp ảo, ứng dụng của bạn cần có cách để lưu trữ các con trỏ đến các phương thức ảo. Điều này được gọi là vtable, giống hệt với tất cả các cá thể của cùng một lớp. Vì bạn cần biết tại thời gian chạy mà phương thức 'tường minh' để gọi cho 'phương thức ảo' nào một con trỏ tới vtable được lưu trữ trong cá thể lớp. Do đó, vtable-pointer (hoặc vptr) cần 4 byte (hoặc 8 byte trên hệ thống 64 bit).
Con trỏ này không được lưu trữ bên trong đối tượng. Không cần phải làm thế. Bạn đã có một con trỏ hoặc một đối tượng để gọi các hàm. Đối với kích thước của 1, tiêu chuẩn C++ reqires rằng các đối tượng distict có địa chỉ riêng biệt.
Kích thước của con trỏ luôn là kích thước của loại con trỏ cần thiết để được lưu trữ trong bộ nhớ.Ví dụ, nếu địa chỉ bộ nhớ của một int là 32 bit trên kiến trúc 64 bit, thì
int a = 10; int * b = & a; sizeof (b); // 32 sizeof (& b); 64
bên cạnh đó sizeof() trả về số byte, không phải bit, sizeof (int *) và sizeof (int **) không thể khác nhau. – PlasmaHH
- 1. Kích thước của con trỏ là gì?
- 2. con trỏ "này" bên trong một lớp
- 3. kích thước của mảng và kích thước của con trỏ nhân vật nhân vật
- 4. Lấy kích thước con trỏ trong C
- 5. Tại sao sizeof (param_array) là kích thước của con trỏ?
- 6. Nhiều thừa kế: kích thước của lớp cho con trỏ ảo?
- 7. Con trỏ 'này' có khác với con trỏ của đối tượng không?
- 8. C con trỏ: trỏ đến một mảng có kích thước cố định
- 9. Tìm kích thước của một chuỗi chỉ bởi một con trỏ
- 10. Cách tắt con trỏ thay đổi kích thước
- 11. Con trỏ có thể có kích thước khác nhau không?
- 12. Con trỏ C++ có kích thước bit cụ thể
- 13. Có thể gọi memset() với một con trỏ null nếu kích thước là 0 không?
- 14. Kích thước con trỏ có khác nhau giữa dữ liệu và con trỏ hàm không?
- 15. Kích thước đường con trỏ CSS khi nhập trường Nhập
- 16. tìm kích thước của đối tượng lớp dẫn xuất bằng cách sử dụng con trỏ lớp cơ sở
- 17. Cách lấy kích thước con trỏ trong C#
- 18. Cách thay thế kích thước máy tính của một loại sử dụng số học con trỏ
- 19. Kích thước của một cấu trúc có hai con trỏ void là 4?
- 20. Tương đương với con trỏ 'này'
- 21. Lớp C++ với con trỏ tĩnh
- 22. C++ typecast: đúc một con trỏ từ con trỏ void đến con trỏ lớp
- 23. Vượt qua một mảng tới một hàm bọc như kích thước con trỏ + hoặc phạm vi
- 24. Con trỏ 'này' là gì?
- 25. Về sizeof của một hàm thành viên lớp con trỏ
- 26. Xác định kích thước của lớp C++ đa hình
- 27. Kích thước của con trỏ có thay đổi theo C không?
- 28. Kích thước tối đa của SharedPreferences lớp
- 29. Cuối FILE * con trỏ không bằng kích thước của dữ liệu bằng văn bản
- 30. Có an toàn khi giả định rằng một con trỏ có kích thước của một int trong C không?
bản sao: http://stackoverflow.com/questions/621616/c-what-is-the-size-of-an-object-of-an-empty-class http://stackoverflow.com/questions/2362097/empty-class-in-c –