TypechoJoeTheme

MetMan's Blog

网站页面

Fortran标准库系列:查询变量占用内存大小

MetMan博 主神仙
2024-11-03
/
0 评论
/
13 阅读
/
426 个字
/
百度已收录
11/03
本文最后更新于 2024年11月03日,已超过 11天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

C语言提供sizeof()运算符计算数据类型对象占用内存字节数,常用于malloc分配对象空间时使用。那么Fortran语言中是否有类似函数计算对象大小?

Fortran标准实际上提供了STORAGE_SIZEC_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字节。关于数据对齐内容后面有机会单独讲讲。
fortran
朗读
赞(0)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

MetMan's Blog

本文链接:

https://blog.metman.top/index.php/archives/142/(转载时请注明本文出处及文章链接)

评论 (0)

互动读者

标签云

最新回复

  1. tqymnonccc打酱油
    2024-09-27
  2. toibdpojay打酱油
    2024-09-22
  3. yvctxyevvw打酱油
    2024-09-22
  4. frezhwzwuq打酱油
    2024-09-22
登录
X
用户名
密码