首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

对象的大小,该如何解决

2012-04-07 
对象的大小对于对象的大小我遇到了几个困惑,想请教一下各位一、我定义了一个如下形式的类Aclass A{}不含任

对象的大小
对于对象的大小我遇到了几个困惑,想请教一下各位
一、我定义了一个如下形式的类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字长的整倍数.所以编译器不会再做像上面那样的内存对齐操作.

热点排行