今晚跟D探讨了c程序的类型大小问题,有点收获,现在总结(并附带问题):
1. 我们常说的“64位机”到底是指“64位寻址”(即地址总线宽度为64bit)还是说数据总线的宽度为64bit?
2. 有c语言中,char 类型占1 个byte, int 占 4个byte, long 和 float 也是4个byte, double 占8个 byte, 而指针,无论是什么类型的指针,都只占4 个byte(4*8=32bit), 因为指针是存放地址,而32位机中,地址宽度为32位,所以指针的宽度是相应的32bit.
3. 在机上写了些程序, 发现了几个关于sizeof的有趣的特性:
输出结果是:
Only_chars: 5
Int_and_char: 12
Double_and_char: 16
结果表明,
1. 类定义中的数据类型会被分配内存,分配的单元长度由类中最宽的数据类型决定,
例如,在Only_chars类中最宽的类型为 char, 宽度为1 byte, 所以以1为单位分配了5个;
而在Int_and_char类中, 最宽的类型为 int, 宽度为4 byte, 第一个数据成员 char c1虽然为char, 但依旧分配了4个,第三个char类型的数据成员也是这样, 所以加上第二个int数据成员,总共分配了12byte.
在Double_and_char类中, 最宽的类型为 double, 宽度为8 byte, 所以即使当中的int类型的数据成员, 编译器也硬是分了8个byte给它(好浪费啊!)
2. 函数成员不占内存空间。
3. 分配内存与数据成员声明的次序有关!
如果将 Int_and_char 类中的 数据成员调换顺序:
输出结果会是
Int_and_char: 8
!!!!!
如此说来,为了节省内存, 在声明类中的数据成员时,最好把相同类型的数据都集中在一起声明!!