虚指针按最大字节对齐?
我是在vc和vs2008里面测试的。代码如下:
这样测试也就是说明vc/vs中是将虚指针放在类的最开始的。而且虚指针后面有4字节的空间才到aa变量
4(虚指针)+ 4(对齐?)+ 1(aa)+7(对齐)+8(ab)= 24
但是按照一般的理解内存布局不应该是
4(虚指针)+1(aa)+3(对齐)+8(ab)= 16
我又测试了各种排列方式,但是不管怎么排列,输出大小总是24
不知道是不是vc/vs编译器中规定了虚指针大小和类中最大元素一至(如果该元素大于4)
如果是这样有什么用处呢?
#include<iostream>
using namespace std;
typedef void(*Fun)(void);
class A
{
public:
A():aa('a'),ab(3.0)
{
}
virtual void AA()
{
cout<<"A"<<endl;
}
char aa;
double ab;
};
int main()
{
A b;
cout << sizeof(A) << endl; //大小为24
Fun pFun = NULL;
pFun = (Fun)*((int*)*(int*)(&b));
pFun(); //正确调用虚函数输出“A”
cout << char(*((char*)(&b)+8))<< endl; //正确输出aa的值'a'
cout << double(*((double*)(&b)+2))<< endl; //正确输出ab的值'3'
return 0;
}
这样测试也就是说明vc/vs中是将虚指针放在类的最开始的。而且虚指针后面有4字节的空间才到aa变量
4(虚指针)+ 4(对齐?)+ 1(aa)+7(对齐)+8(ab)= 24
但是按照一般的理解内存布局不应该是
4(虚指针)+1(aa)+3(对齐)+8(ab)= 16
我又测试了各种排列方式,但是不管怎么排列,输出大小总是24
不知道是不是vc/vs编译器中规定了虚指针大小和类中最大元素一至(如果该元素大于4)
如果是这样有什么用处呢?
...全文
相关推荐
C++虚函数表与虚指针[项目源码]
虚指针是类对象内部的一个隐藏指针,用于指向该对象所属类的虚函数表。当使用多态时,即通过基类指针或引用来调用派生类的成员函数时,通过虚函数表和虚指针可以找到并调用正确的函数版本。
关于vptr(虚指针)和vtbl(虚函数表)1
虚指针(vptr)与虚函数表(vtbl)虚指针(vptr)和虚函数表(vtbl)是C++中实现多态性的重要机制。
虚函数的原理,虚函数实现方式
### 虚指针(Virtual Pointer)除了虚函数表,编译器还会在每个包含虚函数的对象中插入一个虚指针,这个指针指向该对象所属类的虚函数表。
虚函数与多态机制详解[源码]
当对象被创建时,虚指针会初始化指向正确的虚表。当通过基类指针或引用调用虚函数时,程序会通过虚指针查找虚表,然后跳转到实际需要调用的函数地址,完成动态绑定。
C++释难解惑
- 通过虚指针,对象可以访问其虚表,并间接调用相应的虚函数。#### 3. **虚指针(Virtual Pointer)** - 每个对象都包含一个虚指针,用于指向其虚表。


