Tôi có một lớp đơn giản trong C++ có một số nguyên và một vtable:MSVC Object Layout Quirk
class Something {
virtual void sampleVirtualMethod();
int someInteger;
};
Nếu bạn nhìn vào cách bố trí đối tượng cho MSVC (sử dụng/d1reportSingleClassLayout) bạn nhận được:
class Something size(8):
+---
0 | {vfptr}
4 | someInteger
+---
Điều này có ý nghĩa hoàn toàn. 4 byte cho con trỏ vtable và 4 byte cho số nguyên. Điều lạ là khi tôi thêm một đôi đến lớp:
class Something {
virtual void sampleVirtualMethod();
int someInteger;
**double someDouble;**
};
tôi nhận bố trí này đối tượng:
class Something size(24):
+---
0 | {vfptr}
8 | someInteger
| <alignment member> (size=4)
16 | someDouble
+---
Tại sao chênh lệch giữa 0 và bù đắp someInteger 8 thay vì 4? Vtable có tăng lên 8 byte không? Không có vấn đề thứ tự khi tôi thêm một đôi, điều này xảy ra.
Cảm ơn.
Tôi không thể không tự hỏi tại sao bạn lại quan tâm đến điều này. Điều này có gây ra sự cố trực tiếp cho những gì bạn đang làm việc không? –
Tại sao * không * quan tâm đến nó? Thật ngạc nhiên với OP (và với tôi). Đâu là tác hại trong việc cố gắng học những điều mới? ;) – jalf
Tôi đang cố gắng hợp nhất các mô hình đối tượng giữa các tệp nhị phân và tệp nhị phân của studio trực quan. Nó thực sự là một vấn đề :). Điều kỳ lạ là cả hai GCC và Visual Studio cả hai lay ra các đối tượng như thế này trong khi llvm thì không. – Mason