关于C语言的sizeof探秘

来源:互联网 发布:mysql面试基本语句 编辑:程序博客网 时间:2024/06/02 19:48

今晚跟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

 

!!!!!

 

如此说来,为了节省内存, 在声明类中的数据成员时,最好把相同类型的数据都集中在一起声明!!

 

 

原创粉丝点击