对象的大小
对于对象的大小我遇到了几个困惑,想请教一下各位
一、我定义了一个如下形式的类A
class A
{
};
不含任何成员,在VC6.0下用sizeof(A)测试时输出为1,对于不含任何数据成员的类,系统为它分配的这一个字节空间存放什么呢?
二、再有如下基类(Student)和派生类(Student1)
class Student
{
public:
Student()
{
cout<<"please input"<<endl;
cout<<"num: ";
cin>>num;
cout<<"name: ";
cin>>name;
cout<<"sex: ";
cin>>sex;
}
void get_value()
{ cin>>num>>name>>sex;}
void display( )
{
cout<<endl;
cout<<"num: "<<num<<endl;
cout<<"name: "<<name<<endl;
cout<<"sex: "<<sex<<endl;
}
private :
int num;
string name;
char sex;
};
class Student1: public Student
{
public:
Student1()
{
cout<<"age: ";
cin>>age;
cout<<"addr: ";
cin>>addr;
}
void display()
{
Student::display( );
cout<<"age: "<<age<<endl;
cout<<"address: "<<addr<<endl;
}
private:
int age;
string addr;
};
在VC6.0下的测试结果分别为
sizeof(Student)= 24, 而4+16(VC6.0下string占16字节)+1=21
sizeof(Student1)=44,而4+16+1+4+16=41
那么这分别多出的三个字节是什么呢?
三、对于下面的Box类,测试结果是12(正好是三个数据成员的和),为什么会有这样的差异呢?
class Box
{public:
Box();
Box(int h,int w ,int len):height(h),width(w),length(len){}
int volume();
private:
int height;
int width;
int length;
};
Box::Box()
{height=10;
width=10;
length=10;
}
int Box::volume()
{return(height*width*length);
}
[解决办法]
lz可以找找内存补齐的文章看看
我一般都是用很傻的办法:所得数为4的倍数
比如得到21,那结果就是24
得到31,结果就是32
[解决办法]
VC中结构体数据成员的对齐问题
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的
对齐方式调整位置,空缺的字节VC会自动填充.同时VC为了确保结构的大小为结构
的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在
为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字.
struct MyStruct { double dda1; char dda; int type };
为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一
个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为
sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节.接下来为第二
个成员dda分配空间,下一个可以分配的地址对于结构的起始地址的偏移量为8,是
sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变
量占用sizeof(char)=1个字节.接下来为第三个成员type分配空间,这时下一个可
以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了
满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东
西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof
(int)=4的倍数,所以把type存放在偏移量为12的地方,该变量占用sizeof(int)=4
个字节.这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:
8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字
节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充.所以整个结构的大
小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何
有意义的东西.
静态数据成员是存放在静态区共有的,不算在结构体中.
没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存
中都有唯一的地址。
sizeof(func("1234"))=4//func的返回类型为int,所以相当于//求sizeof(int)
[解决办法]
“在VC6.0下用sizeof(A)测试时输出为1”
因为要占位
------解决方案--------------------
这个就是最简单的字节对齐的问题
基本上到最后都是4的倍数,论坛里有很多这样的例子,高手们也讲了很多,随便搜一下,好好研究一下吧,呵呵
[解决办法]
2楼:按照你的说法,sizeof(Student)不应该是24呀,该是4+12+16+1=33才对
呀?不解
[解决办法]
问题1的原因:
一个空的类,事实上并不是空的,它应该隐藏着1 byte,这1 个byte是被编译器插进去的.它的目的是使应该类的对像能在内在中得到一个地址.(该问题的深入请阅读<<Inside The C++ Object Model>>第3章)
问题2中多出来的3个字节是为是内存对齐的原因.因为CPU访问的地址是字长整倍数时速度最快.
问题3中,类Box只有三个成员变量.它们的类型为int型.众所皆知int型的长度为4个字节.3个成员变量不就是4+4+4么?刚好等于12,而且12也刚好是CPU字长的整倍数.所以编译器不会再做像上面那样的内存对齐操作.