8
4.3 分析
Test 类的大小为 16,String 类的大小为 8,通过分析可知,这 16 字节的内
存由 Test 类中两个字符型指针变量和两个整型变量所占用,每个都是 4 字节,
String 类的 8 字节由一个字符型指针变量 str 和一个整型变量 len 所占用,各
占用 4 字节。这些非静态成员函数的地址集中在一起。所以,类的大小只和其中
的非静态成员变量有关,与静态成员变量,常静态成员变量以及函数没有关系,
因为前两者分布在静态区,函数分布在函数区(代码区),他们为所有对象同时使
用,这样设计可以减少内存的消耗。复制构造函数构造的对象,无论是全局对象,
new 出来的对象,还是 auto 对象,复制构造函数构造的对象,内存都分配在 Stack
区,并且地址与原对象不同。
String 全局对象分配在全局区,它的大小也是 8 个字节。对于全局对象的
两个非静态成员变量,并没有在 Stack 区,而是在全局区。
使用动态分配内存的方法创建对象,内存在动态区(Heap 区),他和其他动态
创建的变量一样,也是顺序分配内存的,大小和 Stack 区的对象一样。
通过对 String 类不同对象去调用其静态成员函数 StringCount()来输出
String 类的静态成员变量 num_string(对象的个数),所得结果一样。另外通过
不同的对象去输出静态成员函数的地址,所得到的地址一样,且都位于函数区。
再次证明静态成员函数和静态成员变量被所有对象共享。