2002-06-19 [長年日記]

EVC4

ちゃんと/GXと/GRがサポートされてます。clarmでは/QRxscaleなんていうオプションもありますね。/QRarch5, /QRarch5Tなんてのも。

試しにEVC4のコンパイラを使って、2.1系をコンパイルしてみましょう。_MSC_VERが1220になっているみたいで、

#if _MSC_VER <= 1200
になっているところで引っかかります。
#if _MSC_VER <= 1220
にしたところその部分は通りました。

それから/Oiをつけて<stdlib.h>をincludeするとC2370のエラーになります。これもリリースノートによるとintrinsicがサポートされたと書いてあるので、これとのからみっぽいですね。多分、CE.NETのSDKなら大丈夫なんでしょうけれど、HPC ProのSDKなのでおかしいと。とりあえず/Oiは外すことに。

この二つの修正でコンパイルは通りました。実行してみたところ、一通り動作するようです。

とりあえず、2.1.16はこのコンパイラで作成してみて、問題ないかどうか検証してみることにしましょう。

STL on EVC4

EVC4には、CE.NETのStandard SDKというのが付いてくるんですが、この中にはちゃんとSTLも入っていました。ざっと見たところVC6についているやつと同じやつ(DinkumwareのOEM)のようです。ちなみにiostream周りとかは入っていませんね。

STLportで例外処理を有効にしてちゃんと動くかどうかがポイントでしょうか。

STLport on CE

STLport-4.5.3のソースを見ていたら、config/stl_wince.hで、

# define _STLP_NO_THREADS 1

なんていうのを発見。昔はなかったはずなのにと思って順番に見ていったら、4.0の時にはなかったけれど、4.5には既に存在した。これが定義されていると、ノードアロケータの排他制御が働かないはず。そもそもconfig/stl_wince.hでは、

# undef _STLP_USE_NEWALLOC
# define _STLP_USE_MALLOC

になっていてノードアロケータは使わないようになっているので本来なら影響なしということか?。でもデフォルトじゃ遅すぎるためノードアロケータを使うようにしているので、このままじゃ排他制御なしでノードアロケータを使っていることになるのか?。んー、いけてない。

と思ってもうちょっと見てみてると、config/stl_wince.hはconfig/stl_msvc.hからインクルードされているのだけれど、インクルードするより前に、

# if defined ( _MT ) && !defined (_STLP_NO_THREADS)  &&
  !defined (_REENTRANT)
#   define _REENTRANT 1
# endif

なんていうのがある。CEの場合_MTは必ず付くから、_REENTRANTは必ず定義されることになる。そんでもって、_config.hには、config/stlcomp.hをインクルードした後(つまり、config/stl_msvc.hをインクルードした後)に、

#  if defined (_REENTRANT) && ! defined (_STLP_THREADS)
#   define _STLP_THREADS
#  endif /* _REENTRANT */

なんていうのがある。ということは、_STLP_THREADSは定義されるのか?。ノードアロケータがスレッドセーフかどうかを定義しているのは、stl/_alloc.hの

#if defined (_STLP_THREADS) || (defined(_STLP_OWN_IOSTREAMS) &&
  ! defined (_STLP_NO_THREADS) && ! defined (_NOTHREADS) )
# define _STLP_NODE_ALLOCATOR_THREADS true
#else
# define _STLP_NODE_ALLOCATOR_THREADS false
#endif

なので、_STLP_THREADSが定義されていれば、_STLP_NO_THREADSが定義されていようがいまいが、スレッドセーフになるはず。んー、一体どうなっているんだか。デバッガで追わないとどこに入っているのかさっぱりわからん。

そもそも、_STLP_NO_THREADSと_STLP_THREADSの両方があるのはわかりにくくないか?


トップ «前の日記(2002-06-18) 最新 次の日記(2002-06-20)»