结构体(类)位制

若静态变量 static int i; 是全局变量,则 sizeof(i) = 4; //存储在静态区

若静态变量存在于结构体或类中,则sizeof(A) = 1;//静态变量也存储于静态区,结构体的大小只计算非静态变量。

       对空类或结构体,使用sizeof会返回1;//因为,如果类或结构体占用内存为0话,无法实例化并区分,故编译器为了使空类能够实例化分配了1Byte。

struct A 
{       
    static int i;    
};

int A::i = 1;

如果类中存在虚函数的话,类的大小增加一个指向虚函数表的指针的大小。

 

结构体位制

当数据存储不需要占用完整的一个字节,只需要几位或者一位二进制位的时候,为了节省空间,C语言提出的一种数据结构,称“位域”或者“位段”。位域即把一个字节按位划分成区域。

经测试,发现结构体位制以下特点:

1. 位域的成员可以是char、short、int、unsigned类型。

 

2.命名的位域位宽不能为0,长度为0的位域不能指定名字,否则编译出错。

 

3.长度为0的位域的作用是使下一个成员从下一个存储单位(大小与定义位域的类型有关)开始存放;

 

4.位域之外的其他内存的值并不受到改变;0位域没有使定义位域外的值赋为0。(gcc/vc6.0编译的结果)

 

例如以下程序:

image

初始内存分布情况:从0x22ff68出开始,

image

内存变化情况如下:

image

 

 

 

 

 

结果为:

image

posted @ 2013-04-09 16:18  winko  阅读(430)  评论(0编辑  收藏  举报