[C_Basic]再谈编译器字节问题

1 首先引用网友redleaves的话:
   "结构体的字段取自身对齐参数(字段类型的大小)和指定对齐参数(pack给出的参数)的小者对齐; 结构体的大小必须是所有对齐参数的整数倍,不足则补空位; 结构体变量的对齐参数取所有对齐参数中最大的"。
   这里的对齐是指该字段的起始位置(必须是对齐参数的整数倍)。

   所有int型的地址都是sizeof(int)的整数倍。直观上看,内存结构是很规整的。

2  关于自然对齐
     没有绝对的自然对齐,只有编译器默认的对齐方式。

3 关于编译器和平台
    在不同的平台下,不同的编译器下虽然遵循的规则是一样的, 但编译器和平台却有很大差异。

3.1 关于编译器(指定对齐参数的问题)
   编译器一般会有一个默认的对齐参数, 这个参数越大,那么对齐方式就越自然(因为对齐参数取的是编译器给出的对齐参数和字段大小中的小者)
   
    Debian Linux, G++ 默认对齐参数为4,最大也为4
    Win XP, VC 默认对齐参数为16, 最大也为16

3.2 关于64位的平台(自身对齐参数的问题)
    64位平台的问题主要是引起对int型,long型变量类型大小讨论。
   这牵扯到了C语言标准,和行业标准.

    我认为错误的观点:
    “因为在C89,90,99,C++98的标准中,int的长度是会随平台不同而变化的,long的长度却始终是固定的32位.”
    “不过根据我查看标准文档,文档里说只有"plain   int"即"int"类型是随平台变化的,其它的整数类型都是定长的."
    “至于编译器为什么这么做,我就不得而知了.但如果64位台下long是64位,那C99中加入的long   long类型可以说是多此一举了....”

    我认为正确的观点
    “我在ia64,ibm,hp的64位平台都作过测试。一般64位平台遵守 LP64模型,即long和pointer类型是64位的,其他类型长度一般与原来的32位平台相同”

    (LP64模型 Long Pointer)


  
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值