他の人が興味を持つかもしれない一般的な質問:
私は、switch ステートメントで C++ コンパイラの最適化 (Visual Studio 2005) の問題に遭遇したと思います。私が知りたいのは、私の好奇心を満たし、コンパイラが何をしようとしているが失敗しているのかを知る方法があるかどうかです。解読に時間を費やすことができるログはありますか (おそらく時間がかかりすぎます)。
続きを読みたいという好奇心旺盛な人のための私の特定の問題- この特定のケースで問題が発生する理由について、あなたの考えを聞きたいです。
switch ステートメントを含む約 500 行のコードを含む小さなプログラムがあります。一部のケースには、ポインターの割り当てが含まれています。
double *ptx, *pty, *ptz;
double **ppt = new double*[3];
//some code initializing etc ptx, pty and ptz
ppt[0]=ptx;
ppt[1]=pty; //<----- this statement causes problems
ppt[2]=ptz;
中間のステートメントでコンパイラがハングしているようです。コンパイルは終わりません。OK、廊下を歩き、何人かと話し、コーヒーを飲んで机に戻るまでにそれほど時間はかかりませんでしたが、これは通常 1 秒以内にコンパイルされる小さなプログラムです。1 行 (上記のコードに示されている行) を削除すると、最適化 (プログラム全体または関数で #pragma を使用) を削除する場合と同様に、問題は解消されます。
この中間線が問題を引き起こすのはなぜですか? コンパイラのオプティマイザは pty を好みません。プログラム内のベクトル ptx、pty、および ptz に違いはありません。私が pty に対して行うことはすべて、ptx と ptz に対して行います。ppt で位置を交換しようとしましたが、pty は依然として問題を引き起こしている行でした。
どうなっているのか気になったので質問させていただきます。コードは書き直され、正常に動作しています。
編集: ほぼ 2 週間後、上記のコードに最も近いバージョンをチェックアウトしましたが、元に戻してクラッシュさせることはできません。これは本当に迷惑で、恥ずかしくてイライラします。もう一度試してみますが、すぐに壊れない場合は、質問のこの部分が時代遅れになっていると思いますので、削除します。お時間を頂戴し誠に申し訳ございませんでした。