64,648
社区成员
发帖
与我相关
我的任务
分享
//t.cpp
#include "stdafx.h"
#include<iostream>
#include<functional>
using namespace std;
class A{
virtual void foo(){}
};
class B{
double i;
char j;
virtual void foo(){}
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(A)<<endl;//4
cout<<sizeof(B)<<endl;//24?? WHY??
return 0;
}
class A size(8):
+---
0 | {vfptr}
+---
A::$vftable@:
| &A_meta
| 0
0 | &A::foo
A::foo this adjustor: 0
class B size(24):
+---
0 | {vfptr}
8 | i
16 | j
| <alignment member> (size=7)
+---
B::$vftable@:
| &B_meta
| 0
0 | &B::foo
B::foo this adjustor: 0
class A{
virtual void foo(){}
};
class B{
char j;
double i;
virtual void foo(){}
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(A)<<endl;//4
cout<<sizeof(B)<<endl;//24?? WHY??
return 0;
}
在32bit下编译,B的结果还是24.查看内存分布:
1> class A size(4):
1> +---
1> 0 | {vfptr}
1> +---
1>
1> A::$vftable@:
1> | &A_meta
1> | 0
1> 0 | &A::foo
1>
1> A::foo this adjustor: 0
1>
1>
1> class B size(24):
1> +---
1> 0 | {vfptr}
1> 8 | j
1> | <alignment member> (size=7)
1> 16 | i
1> +---
这个有点郁闷了,j为何要在8字节,命名第4字节可用啊。
但是如果加上#pragma pack(4) 。输出的就是sizeof(B)=16了。好吧,可能认为VS中字节对齐方式不固定。[/quote]
64位系统, 地址也是64为呀。 class A{
virtual void foo(){}
};
class B{
char j;
double i;
virtual void foo(){}
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(A)<<endl;//4
cout<<sizeof(B)<<endl;//24?? WHY??
return 0;
}
在32bit下编译,B的结果还是24.查看内存分布:
1> class A size(4):
1> +---
1> 0 | {vfptr}
1> +---
1>
1> A::$vftable@:
1> | &A_meta
1> | 0
1> 0 | &A::foo
1>
1> A::foo this adjustor: 0
1>
1>
1> class B size(24):
1> +---
1> 0 | {vfptr}
1> 8 | j
1> | <alignment member> (size=7)
1> 16 | i
1> +---
这个有点郁闷了,j为何要在8字节,命名第4字节可用啊。
但是如果加上#pragma pack(4) 。输出的就是sizeof(B)=16了。好吧,可能认为VS中字节对齐方式不固定。class C
{
char i;
double j;
virtual void foo(){}
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(C)<<endl;//24??
return 0;
}
还是24.
还有虚函数指针不是放在类的前面的。分配字节的时候,是按照虚函数定义的地方的顺序分配的。[/quote]
class C
{
virtual void foo1(){}
double j;
virtual void foo2(){}
};
要你这么说,虚函数表指针在这个类里面应该放在哪里?为了实现多态,虚函数表指针的位置是固定的,不管有多少个虚函数,也不管在什么位置定义。[/quote]
嗯,有道理。这里是我错了。class C
{
char i;
double j;
virtual void foo(){}
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(C)<<endl;//24??
return 0;
}
还是24.
还有虚函数指针不是放在类的前面的。分配字节的时候,是按照虚函数定义的地方的顺序分配的。[/quote]
class C
{
virtual void foo1(){}
double j;
virtual void foo2(){}
};
要你这么说,虚函数表指针在这个类里面应该放在哪里?为了实现多态,虚函数表指针的位置是固定的,不管有多少个虚函数,也不管在什么位置定义。class C
{
char i;
double j;
virtual void foo(){}
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(C)<<endl;//24??
return 0;
}
还是24.
还有虚函数指针不是放在类的前面的。分配字节的时候,是按照虚函数定义的地方的顺序分配的。class B{
double i;
char j;
int k;
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(B)<<endl;//16
return 0;
}
这个结果为何是16呢?