| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1205 人关注过本帖
标题:类的对象长度问题
只看楼主 加入收藏
wimphy
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2005-12-1
收藏
得分:0 
还有一个现象
就是当我把输出语句这样写的时候,结果也不一样了

cout<<sizeof(a)<<endl;
cout<<sizeof(*p1)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(*p2)<<endl;


a和b输出sizeof的结果也不一样,为什么呢?

[此贴子已经被作者于2006-5-10 22:56:19编辑过]

2006-05-10 22:56
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
比如你有个这样的类:
class myclass
{
char arr[10];
int x;
float y;
double;
}
你会认为sizeof(myclass)是多少呢?
可能你认为是10+4+4+8=26,那你错了,他是按最大类型所需要的空间成倍增长分配的,当也就是说只答案可能是8的倍数。
怎么算呢?首先分配一个8字节给arr数组再给8出来,给其他人分享,其中有2个是给另外的2个char的,但是那样就只剩下6个字节了,所以只能再给一个int,因为里面不能存储其他类型了,所以又要分配8个出来给y,然而,象前面一样,又不能往里放了,所以又要给8个出来存放double。
如果再声明一个变量,则又要分配8个字节,因为数据存储在栈中,是按顺序压入的,所以不能往前面的空位压入,只能继续分配8个。

[此贴子已经被作者于2006-5-11 14:42:00编辑过]


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-10 22:58
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
嗯,12楼说得是普通情况,其实你可以让myclass的大小为26,也可以为28,也可以为32,一切取决于编译器的设置,在VC编译器中,菜单Project->setting->C/C++->Code Genration中有一个选项Struct member alignment,这就是设置字节对其的地方,你可以设为1,那么结构myclass就是26的大小,一点也不浪费,设为4,那就是28的大小,主要是char arr[10];的空间变为了12个字节,如果设为8或者16,那么结构的大小就是32了
另外你可以用#pragma pack来单独调节某个结构的字节对其方式

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-05-11 14:12
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
哦,这位兄弟对编译器很熟悉啊!受教

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-11 14:43
song4
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:38
帖 子:1533
专家分:4
注 册:2006-3-25
收藏
得分:0 
系统是8个字节为一单元读取
private:
int a;//int是4个,但下面的double是8个 ,剩下4个字节装不下,所以用下8个装double
double b;//8个
int c;//同上
不信的话
再在后面加上char 还是占24个

嵌入式 ARM 单片机 驱动 RT操作系统 J2ME LINUX  Symbian C C++ 数据结构 JAVA Oracle 设计模式 软件工程 JSP
2006-05-11 15:22
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
你错了,那如果第一个声明的是char,然后声明一个int,然后再声明一个char你认为是多少呢?难道是8吗?错了,是12,因为这里是按4字节每次分配的

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-11 19:21
wimphy
Rank: 1
等 级:新手上路
帖 子:56
专家分:0
注 册:2005-12-1
收藏
得分:0 

彻底的明白了~~~~

2006-05-11 23:00
qddscience
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2006-4-22
收藏
得分:0 
13楼,我在VC++设置完struct的对齐方式为1字节,可是结果和8字节一样啊。编译器还是按8字节分配的,这是啥原因呢?

我屋汝嫌低不住,雕梁画阁也知宽。 大须稳择安巢处,莫道巢成却不安。
2006-05-19 09:34
aogun
Rank: 5Rank: 5
等 级:贵宾
威 望:17
帖 子:638
专家分:0
注 册:2006-4-5
收藏
得分:0 
楼上的mm,我是有名字的,不叫13楼
你说下你的struct是什么结构的,还有你确定是按照我说的方法设置的吗?

世界上总共有 10 种人,一种懂得什么是二进制 ,一种不懂。
2006-05-19 09:55
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
你的名字是:鳌棍?

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-05-19 10:05
快速回复:类的对象长度问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025948 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved