原文
为什么在x86系统上,real.sizeof==16!
它的IEEE754扩展格式:64位尾数+15位指数+符号.
它应该是10字节!
我意思是,可能对齐不同,但为什么即使在数组中,也浪费这么多内存?
根据语言规范,real是"可用的最大浮点大小".即在某些系统上,它是IEEE754的128位四精度浮点数,而不是x87的80位扩展精度浮点数.
可编译以下测试程序来验证它:
pragma(msg, "real is ", cast(int) real.sizeof*8, " bits");
pragma(msg, "real has a ", real.mant_dig, "-bit mantissa");
在注意本电脑(Linux,x86_64)上,使用dmd-c编译此程序,打印出:
`real`是`128`位
`Real`有`64`位尾数
填充.
x86的ABI更喜欢对齐的东西,所以在x86上它是12字节,在x86_64上面是16字节.在这两个时候,你都不会获得x87为你提供的80位的额外精度.
这正是我的意思.ABI可能会填充它,但sizeof仍应提供实际使用的(不计算间隙)字节数.
或是否可改变基本类型的对齐?
代码中,我想根据大小决定处理器是使用双倍扩展还是按实数四倍扩展.
但现在我知道不能依赖它.幸好,有提供了正确信息的mant_dig.
至少在实数数组中,与在布尔数组中一样(奇数长度除外),我期望没有填充.