Для следующего фрагмента кода.sizeof для класса, наследующего базовый класс с виртуальной функцией
/*This program demonstartes how a virtual table pointer
* adds to a size of a class*/
class A{
};
class X{
public:
void doNothing(){}
private:
char a;
};
class Z:public X {
public:
void doNothing(){}
private:
char z;
};
class Y{
public:
virtual void doNothing(){}
private:
char a;
};
class P:public Y {
public:
void doNothing(){}
private:
char pp[4];
};
int main(){
A a;
X x;
Y y;
Z z;
P p;
std::cout << "Size of A:" << sizeof(a) << std::endl;// Prints out 1
std::cout << "Size of X:" << sizeof(x) << std::endl;//Prints out 1
std::cout << "Size of Y:" << sizeof(y) << std::endl;//Prints 8
std::cout << "Size of Z:" << sizeof(z) << std::endl;
//Prints 8 or 12 depending upon wether 4 bytes worth of storrage is used by Z data member.
std::cout << "Size of P:" << sizeof(p) << std::endl;
std::cout << "Size of int:" << sizeof(int) << std::endl;
std::cout << "Size of int*:" << sizeof(int*) << std::endl;
std::cout << "Size of long*:" << sizeof(long*) << std::endl;
std::cout << "Size of long:" << sizeof(long) << std::endl;
return 0;
}
поведение мне кажется, нужно заметить, что всякий раз, когда пустой класс инстанциируется или пустой класс наследуется от границы байта не считаются (то есть: объект размером 1 байт разрешено), в любом другом случае размер объекта, по-видимому, определяется границами байтов.
В чем причина этого? Я спрашиваю, с этого момента я догадываюсь.
Я думаю, что вопрос заключается в следующем: «Почему компилятор, похоже, не заботится о выравнивании/заполнении для пустых классов? Например, почему пустой класс может быть 1 байт, но класс с только элементом char требует заполнения?» Заголовок вопроса все еще не является секвенсором, хотя –
Вы извинились за запутанный вопрос. Теперь, пожалуйста, сделайте еще один шаг и * исправьте это. Вы приняли ответ, так что, возможно, вы можете отредактировать вопрос, чтобы он имел смысл в свете ответа. Например, вы упомянули о виртуальных функциях, но принятый ответ вообще не касается виртуальных функций, так как они действительно релевантны вашему вопросу? –