gpt4 book ai didi

pointers - 派生类型(在 Fortran 中)占用多少字节?位置是否连续?还有一个指向派生类型的指针?

转载 作者:行者123 更新时间:2023-12-04 05:16:26 25 4
gpt4 key购买 nike

我在任何地方都找不到这个,即使它可能是微不足道的,我也想确保我已经很好地理解了。我有 4 个问题(严格相关):

1)如果我像这样在fortran中定义派生类型

    TYPE :: node
INTEGER :: int
REAL :: REALfirst
REAL :: REALsecond
END TYPE
TYPE(node) :: var
allocate(var)

经过上述分配后,它为整数占用了 4 个字节,为 2 个单精度实数占用了 8 个字节,总共 12 个字节。它们是否连续位于内存中?计算机如何存储有关变量类型的信息?我想它需要一些额外的内存来保存。

2)如果在上面的例子中而不是
    TYPE(node)  :: var

我会写:
    TYPE(node),POINTER  :: var

我想如果我编译了一个 32 位可执行文件,ALLOCATE 语句将分配与上面示例中相同数量的内存。正确吗?

3)现在假设我声明了类型
    TYPE :: node
INTEGER :: int
TYPE(node), POINTER :: BEFORE
TYPE(node), POINTER :: AFTER
END TYPE
TYPE(node) :: var
allocate(var)

此处(如果编译为 32 位)它将为整数分配 4 个字节,为 2 个指针分配 8 个字节,总共 12 个字节。是这样吗?同样,计算机如何存储有关变量类型的信息?

4) 在示例 (3) 中,如果我现在编写 ALLOCATE(var%BEFORE),则其他 12 个字节分配给派生类型节点的变量,以及分配给指针 var%BEFORE 的整数类型的 4 个字节(参见示例 3) 现在被释放了,对吗?

谢谢
A.

最佳答案

1) 这不在 fortran 标准中。 realinteger不必是 4 个字节宽。通过指定它们的精度来确保。如果您不关心数字精度,而关心字节数,请这样做

 !In Fortran 2008
use iso_fortran_env

or

!In Fortran 95
integer,parameter :: int32 = selected_int_kind(9)
integer,parameter :: real32 = selected_real_kind(p=6,r=37)

and

TYPE :: node
INTEGER(int32) :: int
REAL(real32) :: REALfirst
REAL(real32) :: REALsecond
END TYPE

允许编译器插入它想要的任何填充。如果您将变量与 4、8 甚至更多字节混合使用,则很可能会发生这种情况。要抑制任何填充,请使用 SEQUENCE .

2)分配的内存将是相同的。编译器还使用一些数据结构(它可能只是一个地址,但不是必须的)进行簿记。

3)我提到的簿记数据结构存储在数据类型中。它可能只是一个地址。

4)指针数据结构可以是4个字节,也可以更多。然而,更重要的一点是,它们并没有被释放。您必须知道在哪里可以找到堆上分配的空间,并为此使用指针。无论您是使用此指针分配新数据,还是指向某个现有数据,都没有关系。

请注意,派生类型的位大小不能在运行时更改,它是固定的。另一个问题是多态变量,但出于这个原因,它们必须动态分配。

关于pointers - 派生类型(在 Fortran 中)占用多少字节?位置是否连续?还有一个指向派生类型的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14205294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com