allocaと比べた場合の可変長配列の唯一いい点は、コンパイラがそれの存在をちゃんと認識するので、呼び出し規約やら何やらの影響でalloca使えないのに使っちゃって大惨事みたいなことが起こりにくいことかなあ。まあ今時はallocaも組み込みだろうから以下略なんだが
2011-05-26 14:27:15x86だとebpにスタックベースを保存しないオプションでコンパイルしている関数からはalloca使えないし使うと大惨事になる
2011-05-26 14:28:54C++の pimpl の最大の欠点は、やっぱりallocaが使えないところだよなあ。まあ危険をおして使う方法がないわけでもないが
2011-05-26 14:32:49@mskwt さきほどググってみるまで知らなかったんですが、MS的にはサポートの優先度が低くて、C言語の方でもC99の可変長配列は未実装だったんですか。確かにもう昔のように競合する商用コンパイラがあって沢山売れてって時代じゃないので仕方ないんですかね。ふつーの人はC#使うだろうし
2011-05-26 14:37:21@n_soda いや、C++ の話…。C はこのままでいいんじゃないの?gcc拡張の backport なんて今更されても困る環境のほうが多いかと。
2011-05-26 14:39:21それあり得ないだろ?どこのコンパイラ? QT @syuu1228: RT @AoiMoe: x86だとebpにスタックベースを保存しないオプションでコンパイルしている関数からはalloca使えないし使うと大惨事になる
2011-05-26 14:41:10@mskwt なるほど。確かにC99の可変長配列は、C++0xにも入りそうにないらしいので(←よく知らないので自信なし)、移植性を気にするなら使っちゃ駄目ですね。
2011-05-26 14:43:18他にも signal や、Write Watch なんかと相性悪いんじゃないかなあ。 < alloca (no frame pointer で alloca 使うやつって誰だ…)
2011-05-26 14:45:55Windowsでも、SEHハンドラやC++ catch内での_alloca使用時の注意がMSDNライブラリに書いてあるね。
2011-05-26 14:48:51@mskwt @syuu1228 @AoiMoe gccだとomit-frame-pointerっていうオプションがあって、コンパイラが省略できると判断した場合は省略しちゃうんですよ。-Oつけると自動的に有効になります。(明示的に無効にもできる) 実行速度には結構効いたような。
2011-05-26 14:50:27Windows はあえて FPO してないんだけどなあ… QT @n_soda: mskwt syuu1228 AoiMoe gccだとomit-frame-pointerっていうオプションがあって、コンパイラが省略できると判断した場合は省略しちゃうんですよ。-Oつけると自動的に
2011-05-26 14:54:31その間のレジスタの一貫性について QT @n_soda: SPはちゃんと保守しているので、signalは大丈夫じゃないかな。
2011-05-26 14:54:50@mskwt あれ、よく分かりません。signalが飛んでくるとレジスタは全部セーブするので、問題ないはずです。シグナルハンドラからlongjmpする場合は、volatile変数以外はsetjmp時の状態に戻るのでこれまた仕様どおりのはずです。他に問題ありましたっけ?
2011-05-26 14:58:21