C++ 类 与虚拟参数的差异 sizeof
Difference sizeof in C++ Classes with virtual parameter
我有这个代码:
#include <stdio.h>
class CoolClass
{
public:
virtual void set(int x){x_=x;};
virtual int get(){return x_;};
private:
int x_;
};
class PlainOldClass
{
public:
void set(int x){x_=x;};
int get(){return x_;};
private:
int x_;
};
int main ()
{
printf("CoolClass:\t %ld \nPlainOldClass:\t %ld \n",
sizeof(CoolClass),sizeof(PlainOldClass));
return 0;
}
输出为:
CoolClass: 16
PlainOldClass: 4
我想知道为什么会这样,我试图找到一些关于虚拟的信息,但我不明白。
非常感谢!
发生这种情况是因为具有虚函数的 类 通常由编译器通过 virtual table, see also this explanation 实现。为了使用这样的虚拟 table,它们在内部存储了一个指向 table 的指针。在您的情况下,CoolClass
的大小由 int
成员的大小(通常为 4 个字节)加上指针的大小(通常为 4 或 8 个字节,具体取决于体系结构:32位与 64 位)。由于填充,您看到 16。
添加 virtual
成员函数时,编译器会分配 space 来保存指向虚拟 table 的指针。在您的情况下,指针的大小看起来是 8。为了将对象的对齐保持在 8 个字节,编译器向对象添加 4 个字节的填充,总共 16 个字节。
如果编译器没有添加填充,sizeof(CoolClass)
会是 12。
第二个class,大小很明显
我有这个代码:
#include <stdio.h>
class CoolClass
{
public:
virtual void set(int x){x_=x;};
virtual int get(){return x_;};
private:
int x_;
};
class PlainOldClass
{
public:
void set(int x){x_=x;};
int get(){return x_;};
private:
int x_;
};
int main ()
{
printf("CoolClass:\t %ld \nPlainOldClass:\t %ld \n",
sizeof(CoolClass),sizeof(PlainOldClass));
return 0;
}
输出为:
CoolClass: 16
PlainOldClass: 4
我想知道为什么会这样,我试图找到一些关于虚拟的信息,但我不明白。
非常感谢!
发生这种情况是因为具有虚函数的 类 通常由编译器通过 virtual table, see also this explanation 实现。为了使用这样的虚拟 table,它们在内部存储了一个指向 table 的指针。在您的情况下,CoolClass
的大小由 int
成员的大小(通常为 4 个字节)加上指针的大小(通常为 4 或 8 个字节,具体取决于体系结构:32位与 64 位)。由于填充,您看到 16。
添加 virtual
成员函数时,编译器会分配 space 来保存指向虚拟 table 的指针。在您的情况下,指针的大小看起来是 8。为了将对象的对齐保持在 8 个字节,编译器向对象添加 4 个字节的填充,总共 16 个字节。
如果编译器没有添加填充,sizeof(CoolClass)
会是 12。
第二个class,大小很明显