考虑以下 C 代码:
#include <stdio.h>
#include <stdint.h>
int main()
{
int16_t i16;
__float80 r80;
printf("size of 16 bit integer: %u\nsize of 80 bit real: %u\n",
sizeof(i16) * 8, sizeof(r80) * 8);
return 0;
}
以及以下 Fortran 代码(我知道使用整数文字作为类型参数是不可移植的):
program test
implicit none
integer(2) :: i16
real(10) :: r80
print '("size of 16 bit integer: ", i0, /, "size of 80 bit real: ", i0)', &
& storage_size(i16), storage_size(r80)
end program test
使用 gcc 和 gfortran,两者都会打印:
size of 16 bit integer: 16
size of 80 bit real: 128
问题:为什么80位浮点数是128位宽?
我认为这与内存对齐和优化有关。但是为什么 16 位整数是 16 位宽呢?
P.S. 其实,这与我的另一个问题有关。
你已经回答了你自己的问题:这是x86平台上的gcc/gfortran编译器的一个选择,以便有更好的对齐。
real(kind=10)
是一个 80 位浮点数,存储在 128 位上(48 位未使用)。
这样的选择是性能(128 位边界对齐)和存储(37.5% 浪费)之间平衡的结果。任何选择都是值得怀疑的。请注意,在 32 位上存储 16 位整数意味着 50% 的存储浪费,这是完全不可接受的。