Fortran标准库系列:查询变量占用内存大小
11/03
本文最后更新于
2024年11月03日,已超过
11天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
C语言提供sizeof()
运算符计算数据类型对象占用内存字节数,常用于malloc
分配对象空间时使用。那么Fortran语言中是否有类似函数计算对象大小?
Fortran标准实际上提供了STORAGE_SIZE
和C_SIZEOF
内置函数可以实现该功能,此外GNU编译器提供了额外的扩展SIZEOF
支持该功能。
STORAGE_SIZE
Fortran 2008标准内置函数,函数返回参数A的存储大小,单位是bits。
RESULT = STORAGE_SIZE(A [, KIND])
参数A是任意类型的标量或者数组。可选参数KIND是标量整型常量表达式,用于指定返回值的整型KIND。
需要注意的是,如果传入的参数A是数组,返回的是数组一个元素占有的位数,而不是整个数组存储空间大小。
SIZEOF
GNU扩展,不是Fortran标准内置函数。
计算参数X占用的存储字节数,单位是字节(bytes)。函数假设数组连续。
N = SIZEOF(X)
返回值类型是INTEGER(C_SIZE_T)
,值是参数占用的字节数。
- 如果参数是POINTER属性,返回指向的存储区域字节数。
- 如果参数是包含POINTER或ALLOCATABLE成员的派生类型,返回值不考虑成员指向的数据存储大小。
- 如果参数是多态的,根据动态类型的大小返回值。
C_SIZEOF
Fortran 2008标准,ISO_C_BINDING模块函数。
计算参数占有存储空间,单位是bytes。
N = C_SIZEOF(X)
功能与SIZEOF()
类似。
测试
program main
use iso_c_binding
implicit none
integer :: a(10)
type :: mytype
integer :: a
real*8 :: b
character :: c
end type
type(mytype) :: v
print*,"storage_size(a)=",storage_size(a)/8 ! 转换为bytes
print*,"sizeof(a)=",sizeof(a)
print*,"c_sizeof(a)=",c_sizeof(a)
print*,"storage_size(v)=",storage_size(v)/8 ! 转换为bytes
print*,sizeof(v)
end
执行:
$ gfortran size.f90
$ ./a.out
storage_size(a)= 4
sizeof(a)= 40
c_sizeof(a)= 40
storage_size(v)= 24
24
可以看出:
- 对于数组变量,storage_size函数返回的是数组单个元素所占位数,4字节整型。
- 对于派生类型数据,由于存在数据对齐情况,v变量占用了24个字节,而不是4+8+1=13字节。关于数据对齐内容后面有机会单独讲讲。