Pointers 在Fortran中,使用很少初始化的实例变量,内存最保守的方法是什么?

Pointers 在Fortran中,使用很少初始化的实例变量,内存最保守的方法是什么?,pointers,memory-management,fortran,dynamic-memory-allocation,Pointers,Memory Management,Fortran,Dynamic Memory Allocation,我需要设计一个对象,该对象具有类型为REAL的实例变量,该变量可能包含值,也可能不包含值,也就是说,在某些实例中它可能未定义 TYPE :: object REAL :: result_of_some_calculation END TYPE object 由于这个实例变量可能并不总是被定义的,我想知道是否有一种谨慎的方法来避免在初始化之前为这个实例变量消耗内存。也就是说,我可以做到以下几点: TYPE :: object REAL, POINTER :: result_of_

我需要设计一个对象,该对象具有类型为
REAL
的实例变量,该变量可能包含值,也可能不包含值,也就是说,在某些实例中它可能未定义

TYPE :: object
    REAL :: result_of_some_calculation
END TYPE object
由于这个实例变量可能并不总是被定义的,我想知道是否有一种谨慎的方法来避免在初始化之前为这个实例变量消耗内存。也就是说,我可以做到以下几点:

TYPE :: object
    REAL, POINTER :: result_of_some_calculation => NULL()
    CONTAINS
    PROCEDURE :: get_calculation_result
END TYPE

SUBROUTINE get_calculation_result(self)
   IMPLICIT NONE
   CLASS(object) :: self
   REAL, TARGET :: result
   result = some_function()
   self%result_of_some_calculation => result
END SUBROUTINE get_calculation_result
那么,指针为空时使用的内存会比指向实数时少吗

我知道在这种情况下,我有
实数
的内存开销和
指针
的内存开销,但我希望在更常见的情况下,当这个指针总是保持为空时,我使用的内存比在派生数据类型中使用
实数
并保持该
实数
未定义时更少

或者,我可以创建一个元素的可分配数组:

    TYPE :: object
        REAL, DIMENSION(:), ALLOCATABLE :: result_of_some_calculation
        CONTAINS
        PROCEDURE :: get_calculation_result
    END TYPE

    SUBROUTINE get_calculation_result(self)
       IMPLICIT NONE
       CLASS(object) :: self
       REAL, TARGET :: result

       result = some_function()
       ALLOCATE(self%result_of_some_calculation(1))
       self%result_of_some_calculation(1) = result
    END SUBROUTINE get_calculation_result
这会占用更少的内存吗


简而言之,我的问题是,一个空指针、一个未分配的数组和一个实指针(我知道是4个字节)的内存开销是多少?

这是特定于实现的,但是指向一个非多态的标量对象的指针(或可分配给这样一个对象的指针)通常由机器级指针实现。如果您的代码是为具有32位(4字节)机器级指针的平台编译并运行的,那么这种方法不会为未使用的对象节省内存,并且在使用对象时,除了间接引用的任何性能影响(以及指针情况下的混叠可能性)外,还会使内存消耗翻倍

如果您是在使用64位指针的平台上编译和运行,则机器级指针的大小是所指向数据的两倍

如果您正在处理多态对象,通常会涉及另一个机器级指针,用于描述所指向/分配对象的动态类型

实现在标量对象的描述符中可能有其他字段

更具体的实现,但指向非多态数组的指针或可分配给非多态对象的指针,除了指向实际数据的机器级指针外,还需要有关对象边界(或边界和范围)的信息,例如,对于秩一数组,32位平台上的最小值为12字节。在指针的情况下,您还需要存储一个跨步-另外四个字节。实现通常会有用于各种标志和其他便利的附加字段,并且通常对指针和可分配对象(以及假定的形状对象、多态和非多态对象)使用相同的数据结构。例如,我所熟悉的一个32位平台的秩1数组有一个36字节的描述符——是描述符在您的用例中可能指向的基本标量的九倍。如果您在64位平台上,则执行18次

这些并不是您想要的内存节省


(请注意,将指针与过程的未保存本地对象相关联是毫无意义的-当过程终止时,指针将变得未定义。)

[这不是一个答案,因为它不是确定的,而且我们在很大程度上是具体实现的。]我们希望指针/可分配数组至少占用您的32位实数,但是,即使有节省,与真实的(也许有警卫)相比,额外的复杂性/非直觉肯定不值得吗?你是否有这样一种情况,它是重要的,而不是好奇(当然,这不是坏事)?我确实有这样一种情况,这个对象将被创建大量次,节省内存是值得的,但如果内存成本无法降低,那就这样吧。我会在其他地方寻找节省内存的方法。如果有很多,那么它当然值得考虑——也许值得在问题中强调这一点?此外,即使没有定义的结果,您是否始终需要大量的
类型(对象)
s存在?