请教一个求类的sizeof问题,疑惑
#include <iostream>
using namespace std;
class A
{
double a;
char b;
virtual p(){};
};
void main()
{
cout<<sizeof(A)<<endl;
}
[解决办法]
我的看法是:
虚函数表的指针在起始的4个字节,偏移是:0-3
第二个成员是double 8个字节,因为4%8不等于0,因此需要从第8个字节开始,由此,double偏移是:7-15
第三个成员是char 1个字节,因此偏移16就可以,但是因为结构体的对齐长度是8,所以还填充了7个字节。
总体加起来是24
但是奇怪的是:
- C/C++ code
#include <iostream>using namespace std;class A{char b;double a;virtual p(){};};void main(){cout < <sizeof(A) < <endl;}
[解决办法]
对于这个问题:首先说明一下不带虚函数时候的情况,其分配规则为:
VC对一些变量的起始地址做了“对齐”处理。在默认情况下,VC规定1.各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。下面列出常用类型的对齐方式(vc6.0,32位系统)。
KK类型 对齐方式(变量存放的起始地址相对于结构的起始地址的偏移量)
KKChar 偏移量必须为sizeof(char)即1的倍数
KKShort 偏移量必须为sizeof(short)即2的倍数
KKint KK偏移量必须为sizeof(int)即4的倍数
KKfloat KK偏移量必须为sizeof(float)即4的倍数
KKdouble K 偏移量必须为sizeof(double)即8的倍数
KK各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节VC会自动填充。同时2.VC为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
===========================
上面红色的部分是两条主要的规则。而绿色的部分是解决这个问题的关键。
代码实例1
- C/C++ code
#include <iostream> using namespace std; class A { double a; char b; int c;}; void main() { cout < <sizeof(A) < <endl; }
[解决办法]
对齐问题和虚表指针问题
double 从地址000开始
int 从地址00开始
char 从地址0开始
所以
int
char
double sizeof为16
char double int 为24
还有offset只能够针对pod类型的数据
[解决办法]
我想是不是这样的:
- C/C++ code
#include <iostream>using namespace std;class A{ char b; double a; virtual int p(){};};void main(){cout <<sizeof(A) <<endl;}