Всем привет.
Вопрос следующий:
Это нормально что sizeof(от одного класса) != sizeof(от другого), при условии того что оба класса имеют
а)одинаковое количество переменныых
б)переменные одного и тогоже типа
?
Заранее благодарю.
Здравствуйте, R!M, Вы писали:
R!M>Вопрос следующий:
R!M>Это нормально что sizeof(от одного класса) != sizeof(от другого), при условии того что оба класса имеют
R!M>а)одинаковое количество переменныых
R!M>б)переменные одного и тогоже типа
R!M>?
Вполне, здесь могут влиять выравнивание и наличие/отсутствие виртуальных функций.
... << Машина времени [] Избавление >> ...
Здравствуйте, R!M, Вы писали:
R!M>Это нормально что sizeof(от одного класса) != sizeof(от другого), при условии того что оба класса имеют
R!M>а)одинаковое количество переменныых
R!M>б)переменные одного и тогоже типа
R!M>?
Да, если включено выравнивание (pragma pack). А по умолчанию оно делается или на 4, или на 8 байт.
(ищи на форуме
pragma pack ).
Разный размер будет как при разных значениях выравнивания, так и при одинаковых, но разном порядке полей:
struct A
{
char a1,a2,a3,a4;
long a5,a6,a7;
};
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// a1 a2 a3 a4 a5.++.++.++ a6.++.++.++ a7.++.++.++
struct B
{
char b1;
long b5;
char b2;
long b6;
char b3;
long b7;
char b4;
};
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// b1 -- -- -- b5.++.++.++ b2 -- -- -- b6.++.++.++ и так далее
// выравнено выравнено
Также не забывай о скрытых полях: указатели на таблицы виртуальных методов, виртуальные предки.
class A
{
int a;
};
class B
{
int b;
//VMT_of_B* pVMT;
virtual ~B() {}
};
class A
{
int a1, a2, a3;
};
class B : public A
{
//A ancestor;
int b;
};
class C : public virtual A
{
//A* pAncestor;
int c;
};