若静态变量 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编译的结果)
例如以下程序:
初始内存分布情况:从0x22ff68出开始,
内存变化情况如下:
结果为: