Имам прост клас в C++, който има цяло число и vtable:
class Something {
virtual void sampleVirtualMethod();
int someInteger;
};
Ако погледнете оформлението на обекта за MSVC (използвайки /d1reportSingleClassLayout), получавате:
class Something size(8):
+---
0 | {vfptr}
4 | someInteger
+---
Което има пълен смисъл. 4 байта за указателя на vtable и 4 байта за цялото число. Странното е, когато добавя двойно към класа:
class Something {
virtual void sampleVirtualMethod();
int someInteger;
**double someDouble;**
};
Получавам това оформление на обекта:
class Something size(24):
+---
0 | {vfptr}
8 | someInteger
| <alignment member> (size=4)
16 | someDouble
+---
Защо разликата между отместването 0 и someInteger е 8 вместо 4? Нарасна ли vtable до 8 байта по някакъв начин? Независимо от реда на добавяне на двойно, това се случва.
Благодаря.
vfptr
не може да се промени на 8. Той все още е 4. Но тъй като отместването на членint
се промени на 8, между тях трябва да има<alignment member>
с размер 4. В доклада обаче няма нищо. Това просто няма смисъл. Прилича на бъг. - person AnT   schedule 13.02.2010