| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1391 人关注过本帖
标题:[开源]有关static member 的 小测试 程序
取消只看楼主 加入收藏
cpluslover
Rank: 1
等 级:新手上路
威 望:1
帖 子:91
专家分:0
注 册:2006-12-13
收藏
 问题点数:0 回复次数:5 
[开源]有关static member 的 小测试 程序

code 如下:

#include<iostream>
using namespace std;

class X
{
int a;
static int b;
};

int X::b=0;

class Y
{
int a;
};

class Z
{
static int b;
};

int Z::b=0;

class WQ
{
};

int main()
{
cout<<"静态成员测试如下:"
<<"X size is: "<<sizeof(X)<<endl
<<"Y size is: "<<sizeof(Y)<<endl
<<"Wq size is: "<<sizeof(WQ)<<endl
<<"Z size is: "<<sizeof(Z)<<endl;
return 0;
}

由此可看出一个类不是空的,它占1个字节
静态成员 不在类中占分配空间, 普通成员在类中占有分配空间

搜索更多相关主题的帖子: static int member class 
2007-04-29 18:20
cpluslover
Rank: 1
等 级:新手上路
威 望:1
帖 子:91
专家分:0
注 册:2006-12-13
收藏
得分:0 
class X
{
int a;
static int b;
};
是不是应该占八个字节了但用sizeof试一下发现结果是4

这是不对的,应该知道,static变量 不是属于类的,所以它不在类中占内存,所以只能说是int占的字节 即4个字节

另外一个空类的大小不为0这是肯定的,如果是0的话你建立两个空对象的话怎么区分它们呢
这就是空类大小不为空的一个重要原因。
然后你说的这个用sizeof求了一下结果是8,也说明空类不占内存的呀
这个涉及到空基类的优化问题,具体请看这里http://bbs.bc-cn.net/viewthread.php?tid=76914

“运行正确”的程序不见得是高质量的程序
2007-04-30 16:12
cpluslover
Rank: 1
等 级:新手上路
威 望:1
帖 子:91
专家分:0
注 册:2006-12-13
收藏
得分:0 
以下是引用I喜欢c在2007-4-29 22:47:22的发言:
class X
{ static int b;
int a;
char c;
};

这样呢?

应该是5个吧

static 不在类中占内存,它在内存上不属于类,所以应该占5个,空基类优化了,空的那1个字节不计算在内。
我想是这样的


“运行正确”的程序不见得是高质量的程序
2007-04-30 16:15
cpluslover
Rank: 1
等 级:新手上路
威 望:1
帖 子:91
专家分:0
注 册:2006-12-13
收藏
得分:0 


谢谢楼上的指正,又长知识了,说的很对,要对齐才行。

“运行正确”的程序不见得是高质量的程序
2007-04-30 16:39
cpluslover
Rank: 1
等 级:新手上路
威 望:1
帖 子:91
专家分:0
注 册:2006-12-13
收藏
得分:0 
以下是引用yuyunliuhen在2007-5-1 1:46:54的发言:

我们先排掉static 的干扰,我们可以让它显示出真实的值

class A //64bit,x86环境,VC编译器

{
int a;
char b;
short c;
};
class B
{
char b;
int a;
short c;
};
现在已知64位机器上各种数据类型的长度如下:
char:1(有符号无符号同)
short:2(有符号无符号同)
int:4(有符号无符号同)
long:4(有符号无符号同)
float:4 double:8
那么上面两个结构大小如何呢?
结果是:
sizeof(class A)值为8
sizeof(class B)的值却是12

结构体A中包含了4字节长度的int一个,1字节长度的char一个和2字节长度的short型数据一个,B也一样;按理说A,B大小应该都是7字节。
之所以出现上面的结果是因为编译器要对数据成员在空间上进行对齐。上面是按照编译器的默认设置进行对齐的结果,那么我们是不是可以改变编译器的这种默认对齐设置呢,当然可以.例如:
#pragma pack (2) /*指定按2字节对齐*/
class C
{
char b;
int a;
short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
sizeof(class C)值是8。
修改对齐值为1:
#pragma pack (1) /*指定按1字节对齐*/
class D
{
char b;
int a;
short c;
};
#pragma pack () /*取消指定对齐,恢复缺省对齐*/
sizeof(class D)值为7。


版主研究的可真深入啊

又学习了
强人啊


“运行正确”的程序不见得是高质量的程序
2007-05-01 12:05
cpluslover
Rank: 1
等 级:新手上路
威 望:1
帖 子:91
专家分:0
注 册:2006-12-13
收藏
得分:0 
以下是引用nuciewth在2007-5-1 9:45:50的发言:

计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data alignment)。这样做可能会浪费一些内存,但理论上速度快了。


sizeof使用场合。

5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。

5.由于操作数的字节数在实现时可能出现变化,建议在涉及到操作数字节大小时用sizeof来代替常量计算。

再次学习了


“运行正确”的程序不见得是高质量的程序
2007-05-01 12:09
快速回复:[开源]有关static member 的 小测试 程序
数据加载中...
 
   



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

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