2007年12月16日日曜日

VS2008の変更点: C++

VS2008を使い始めて気がついた点をあげていきます。今回はC++について。

まず/Wp64(64 ビット移植性の問題の検出)のサポートがなくなっています。VS2005の1代でつぶれました。せっかく警告たとしても、Win32では無理やりcastするのが正しいときが多々あり、警告の意味が薄れてしまうからでしょうか。更にはx64コンパイラも用意されていますし、x64プロセッサもクライアントPCにまで出回ってきて、実機でテストしなさい、ってことかもしれません。

新しくSTL/CLRライブラリとC++マーシャリングライブラリが増えています。STL/CLRは本当はVS2005に入るはずだったとか間に合わなかったとかだそうで? C++/CLIは個人的にはC#で書ききれないWin32 nativeな部分のマーシャリング?に使うものという位置づけで、STLの出番はちょっと少ないです。JITで最適化していく.NETでSTL/CLRのコンパイル時インライン展開の最適化はどうなんでしょう?
もう一つのC++マーシャリングはまぁ、今まで必要になった人が書いていたものをあらかじめ用意しましたよ、程度で。こちらもgenericではなくtemplateで書かれているのでコンパイル時にインライン展開されます。
マーシャリングはうれしいけど、もっと根本的な問題#define MessageBox MessageBoxWとSystem::Windows::Forms::MessageBoxの名前がぶつかる問題とか解決してほしいなぁ。

今回なくなったライブラリとしてはATL ServerとATL_MIN_CRT関連。obsolateではなくきれいさっぱり削除されています。ATL Serverは使っていませんでしたがATL_MIN_CRT関連は使っていたのでちょっと痛手。もちろん#ifdefで分けていたので、ファイルサイズが大きくなる程度ですが、気分的に。
一応

Visual C++ 2008では、ATL_MIN_CRTが定義されているかどうかに関係なく、ATLプロジェクトのCRTに対する依存はすべて最小限に抑えられます。
と書かれていますが、この説明に意味はなく、ソースを見る限り「リンカが選択的にリンクしますよ」程度のことでした。

ついでにATLのソースをVS2005とVS2008で比較してみたところ、気づいたことが2点ありました。VS2005ではATL_MIN_CRTの影響なのかセキュリティ強化されたCRTを使わないバージョンが存在しましたが、VS2008ではセキュリティ強化されたCRTが強制的に使われます。おかげでガンガンにCRTを使います。
もう1点、なぜかVS2008でも_MTを見ています。VS2005以降、シングルスレッドCRTライブラリが削除されてマルチスレッドCRTライブラリしか存在しないわけですが、ATLは_MTを見てシングルスレッド動作も意識しています。…でもATL_MIN_CRTが廃止されたためにマルチスレッドCRTライブラリが必須なはずですが f(^^;

0 件のコメント: