据说vptr是在创建对象时创建的,那么为什么具有虚函数的类的大小在32位机器上为4,在64位机器上为8,这是否意味着有一些隐藏的vptr用于具有一些虚函数的基类(也是在派生类中继承)如果是,那么该vptr的用途是什么?
指针的大小取决于操作系统 . 它在32台机器上是32位(4字节),在64位机器上是8字节 .
如果要求类的大小而不是指针的大小,则编译器可能会根据操作系统类型将其调整为32/64的倍数 .
C标准没有定义 vtable 或 vptr 必须存在,而是定义了polimorphism和动态绑定的行为方式 . 虽然 vtable 是与动态绑定相结合的非常常见的polimorphism实现,但 vptr 不是像指针那样的第一类语言结构,您可以像成员一样访问它,或者将其定义为表示有关引用/解除引用的指针或者尺寸 .
vtable
vptr
因此编译器可以自由地使用其他实现,因此您无法使用虚拟成员函数预测对象的大小 .
但是,在大多数实现中, vptr 可能寻址与普通指针相同的内存大小,因此 vptr 的大小很可能与该体系结构中普通指针的大小相同,即32位系统上的4 . 或64位系统上的8 .
2 回答
指针的大小取决于操作系统 . 它在32台机器上是32位(4字节),在64位机器上是8字节 .
如果要求类的大小而不是指针的大小,则编译器可能会根据操作系统类型将其调整为32/64的倍数 .
C标准没有定义
vtable
或vptr
必须存在,而是定义了polimorphism和动态绑定的行为方式 . 虽然vtable
是与动态绑定相结合的非常常见的polimorphism实现,但vptr
不是像指针那样的第一类语言结构,您可以像成员一样访问它,或者将其定义为表示有关引用/解除引用的指针或者尺寸 .因此编译器可以自由地使用其他实现,因此您无法使用虚拟成员函数预测对象的大小 .
但是,在大多数实现中,
vptr
可能寻址与普通指针相同的内存大小,因此vptr
的大小很可能与该体系结构中普通指针的大小相同,即32位系统上的4 . 或64位系统上的8 .