Talk:Fortrantips

From Ecal

Jump to: navigation, search

pointerとallocatable

現在では、allocatableは「initialize=null化とfinalize=deallocateを自動的に行うpointer」、 つまり、使用に制限を加えたことで有用な機能を得たpointerである。pointer⊃allocatable。

初期の頃はpointerはのろいと言われたそうだが、それはもう忘れていい。

  • Q:以前は「allocatableはdeallocateしないとルーチンを抜けた後どうなっているかわからない」ということになっていたがそれは現在では忘れていいということか?
  • A: 自分で昔試してみてたしかに前はそうだったのを記憶している。最新のコンパイラは変数がある限りallocationされたままになっている。私も情報を求む。間違い、もしくはallocatableをtype内に書けない場合のために
#if ALLOCATABLE_IN_TYPE
#define ALLOCATABLE_TARGET  allocatable,target
#define ALLOCATABLE_TARGET_EXIST(x) allocated(x)
#else
#define ALLOCATABLE_TARGET  pointer
#define ALLOCATABLE_TARGET_EXIST(x) associated(x)
#endif
      program test
      integer,ALLOCATABLE_TARGET :: x(:)
      if ( ALLOCATABLE_TARGET_EXIST(x) ) then
         ...
      endif
      end 

とでも私はしておく。 --Kino 13:39, 16 July 2010 (JST)

  • Q:了解です。逆に言えば木野氏の予想は、最新のメジャーなコンパイラでは「変数が不確定になるような状況になるのなら」自動でメモリを開放するぐらいには進化しているはずだ、ということですね。ぼくはcppを上のように使うのはコードの自動解析が困難になるのであまり好きでないです。cppはifdefぐらいにとどめとくのが無難かと思ってます。もちろん場合によるし柔軟に考えていますが。--TakaoKotani 15:24, 16 July 2010 (JST)
  • A:少なくともintel fortranはallocatable属性があるとsubroutineが終了するときにallocatedになっていれば自動的にdeallocateされる、と規定してあります。

自動的にdeallocateされるのは間違いないので、 問題はdeallocateされるのが、変数を定義しているsubroutineが終了するとき=変数がなくなるときか、全てのsubroutineが終了するときか、どちらかです。 local変数ならばsubroutineを終了するときは変数がなくなるときでどちらも同義で問題ない (実際,saveのときはsubroutineが終了しても変数がなくならないのでsubroutineを終了してもdeallocateしないと規定している) ですが、 local変数でなくsubroutineに渡している変数にpointer,allocatableがある場合にはsubroutineが終了しても変数は残ります。 subroutineに渡している変数の振舞について記述してある文書をどのコンパイラの文書でも見たことがありません。たぶん規定されていないのでしょう。だからどちらに解釈されているかを、実際のimplementationから判断するしかありません。 昔見たときは後者でした。最近は前者です。実際にやってみてどうなっているか確かめた結果で「予想」ではありません。

Personal tools