带有虚形参的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
我想知道为什么会这样,我试着找了一些关于虚拟的信息,但是我不明白。
非常感谢!
发生这种情况是因为具有虚函数的类通常由编译器通过虚表实现,另见此解释。为了使用这样的虚表,它们在内部存储一个指向表的指针。在您的示例中,CoolClass
的大小由int
成员的大小(通常为4字节)加上指针的大小(通常为4或8字节,具体取决于体系结构:32位vs 64位)给出。
当添加virtual
成员函数时,编译器会分配空间来存放指向虚表的指针。在您的例子中,指针的大小看起来是8。为了保持对象的对齐长度为8字节,编译器为对象添加了4个字节的填充,总共16个字节。
如果编译器没有添加填充,sizeof(CoolClass)
将是12。
对于第二类,大小是明显的。
相关文章:
- 将两个数组中的差异记录在第三个数组中
- 大小相等但成员数量不同的结构之间的性能差异
- C++constexpr实现差异
- 旧版c++中结构和类之间的差异
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 节点 *temp; 和节点 *tmp = 新节点之间的差异
- GCC 和 Clang 代码性能的巨大差异
- 同一对象的"sizeof"的不同答案
- 类内部和外部静态 constexpr 元组之间的差异
- 平凡类型与非平凡类型的复制消除差异
- 了解算法的性能差异(如果以不同的编程语言实现)
- 以天C++为单位的两个时间戳之间的差异
- 如何以毫秒为单位获取开始时间和 now() 之间的毫秒差异(以 C++为单位?
- 方括号 [] 和括号 () 之间的犰狳库差异
- 不同语言中的模运算符差异
- std::filesystem 和 std::experimental::filesystem 之间的路径差异
- Sizeof() 在 PC 和 Arduino 上的 C++ 之间的差异
- sizeof(str-1)和sizeof(str)-1之间的差异
- 带有虚形参的c++类中的sizeof差异