sizeof

计算机中信息的存储单位
(1)位(Bit):表示一个二进制数码0或1,是计算机存储处理信息的最基本的单位。
(2)字节(Byte):一个字节由8个位组成。它表示作为一个完整处理单位的8个二进制数码。现目前计算机上多使用《美国国家信息交换标准代码》——ASCII编码(由美国国家标准委员会制定)
如:字符“A”的二进制编码是“0100 0001”即41H或65D
      “#”的二进制编码是“0010 0011”即23H或35D
(3)字(Word):16个位为一个字,它代表计算机处理指令或数据的二进制数位数,是计算机进行数据存储和数据处理的运算单位。通常称16位是一个字,32位是一个双字,64位是两个双字。

 

 

 

 

 

sizeof返回的是存储空间in bytes字节。
猜测结构体

 

 

的大小sizeof(test)是多少?

 

在32位的机子上,linux下测试得到的结果是16.而在VC6.0下测试得到的结果也是16.

内存对齐,是指一种计算机体系结构(如X86)对基本数据类型的存储位置有限制,要求其地址为某个数的倍数,通常这个数为4或8。这种要求会简化处理器的设计以及提升数据访问的效率。至于为什么会有这样的设计,简单的说访存总线的位数固定,以32位总线为例,地址总线的地址总是4对齐的,所以数据也四对齐的话,一个周期内就可以把数据读出。这里不理解的话可以跳过去,只要记得对齐这回事儿就行了。如果想更深入的理解,可以看这里另一篇文章

 

而结构体

 

的大小测试,在VC6.0下为24,而在linux下为20.

 

当你在windows上使用VC编译的时候,你会得到24;当你在linux上使用gcc编译的时候,你会得到20!其实,这恰好说明这种数据的对齐是由编译器决定的!在VC中规定, 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;而在gcc中规定对齐模数最大只能是4,也就是说,即使结构体中有double类型,对齐模数还是4,所以数据是按照1,2,4对齐的。所以,在两个不同编译器上,你得到了不同的答案!

更加详细的内容参考两个博客:云中漫步Liu中还有另外一篇介绍

 

根据这两个博客介绍的,我测试了一下 sizeof(int)和sizeof(long)都是4,在linux和windows下都是这样的结果。sizeof(double)是8.

 

据说在64位机子上是不一样的,我没有64位机子,没测试过。

 

另外,关于空的结构体和类,在windows下,无论是用C(struct)还是C++(class),空的结构体均是1.

 

sizeof(node2)和sizeof(Node)是一样的,都是1.

 

但是,在linux下,用C编写结构体得到的结构是0,C++的类大小是1.据上面链接的博客的博主说,这是因为每一个类的对象的地址都是不一样的。有个博客将这部分介绍的比较详细。

 

 

含有,关于sizeof的使用中,博客还给了一个很有意思的实验

 

测试结果给出的两个都是4,而不是100、这是因为函数传递中,数组的传递是按照指针进行的。

 

同时博客给出的几个测试也很有代表性,感觉博主真是个有心人,能把这么多东西整理那么细。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值