allocaと可変長配列

スタックに配列を置きたい。その壮大すぎる願いに支払われる対価のお話。
10
SKS rep @repeatedly

@kumagi allocaとかD言語なら普通に使ってるよ

2011-05-26 14:21:42
AoiMoe a.k.aしお兄P @AoiMoe

allocaと比べた場合の可変長配列の唯一いい点は、コンパイラがそれの存在をちゃんと認識するので、呼び出し規約やら何やらの影響でalloca使えないのに使っちゃって大惨事みたいなことが起こりにくいことかなあ。まあ今時はallocaも組み込みだろうから以下略なんだが

2011-05-26 14:27:15
AoiMoe a.k.aしお兄P @AoiMoe

x86だとebpにスタックベースを保存しないオプションでコンパイルしている関数からはalloca使えないし使うと大惨事になる

2011-05-26 14:28:54
AoiMoe a.k.aしお兄P @AoiMoe

何度も書いてるけど某Xはallocaをnukeしたら1-2割くらい遅くなったので以下略

2011-05-26 14:29:57
AoiMoe a.k.aしお兄P @AoiMoe

一方で、未だに何年かに一回、allocaがらみのバグ報告が来たりするんだなこれが

2011-05-26 14:30:31
AoiMoe a.k.aしお兄P @AoiMoe

大きなときはmallocにfallbackするコードを入れたりとかなー

2011-05-26 14:31:22
AoiMoe a.k.aしお兄P @AoiMoe

C++の pimpl の最大の欠点は、やっぱりallocaが使えないところだよなあ。まあ危険をおして使う方法がないわけでもないが

2011-05-26 14:32:49
野良猫@がんばらない @mskwt

@AoiMoe alloca はページサイズがコンパイル時に仮定入るのが致命的 (伸長のため)

2011-05-26 14:33:24
SODA Noriyuki @n_soda

@mskwt さきほどググってみるまで知らなかったんですが、MS的にはサポートの優先度が低くて、C言語の方でもC99の可変長配列は未実装だったんですか。確かにもう昔のように競合する商用コンパイラがあって沢山売れてって時代じゃないので仕方ないんですかね。ふつーの人はC#使うだろうし

2011-05-26 14:37:21
Egtra (ysk-noh) @egtra

もうちょっと自分のIOCP実装まじめに見直すか。

2011-05-26 14:38:26
野良猫@がんばらない @mskwt

@n_soda いや、C++ の話…。C はこのままでいいんじゃないの?gcc拡張の backport なんて今更されても困る環境のほうが多いかと。

2011-05-26 14:39:21
野良猫@がんばらない @mskwt

それあり得ないだろ?どこのコンパイラ? QT @syuu1228: RT @AoiMoe: x86だとebpにスタックベースを保存しないオプションでコンパイルしている関数からはalloca使えないし使うと大惨事になる

2011-05-26 14:41:10
SODA Noriyuki @n_soda

@mskwt なるほど。確かにC99の可変長配列は、C++0xにも入りそうにないらしいので(←よく知らないので自信なし)、移植性を気にするなら使っちゃ駄目ですね。

2011-05-26 14:43:18
野良猫@がんばらない @mskwt

@n_soda その C + + 0 x とか言う禁句ワードを発すると変なのが沸くのでやめて><

2011-05-26 14:46:57
野良猫@がんばらない @mskwt

他にも signal や、Write Watch なんかと相性悪いんじゃないかなあ。 < alloca (no frame pointer で alloca 使うやつって誰だ…)

2011-05-26 14:45:55
Egtra (ysk-noh) @egtra

Windowsでも、SEHハンドラやC++ catch内での_alloca使用時の注意がMSDNライブラリに書いてあるね。

2011-05-26 14:48:51
SODA Noriyuki @n_soda

@mskwt @syuu1228 @AoiMoe gccだとomit-frame-pointerっていうオプションがあって、コンパイラが省略できると判断した場合は省略しちゃうんですよ。-Oつけると自動的に有効になります。(明示的に無効にもできる) 実行速度には結構効いたような。

2011-05-26 14:50:27
SODA Noriyuki @n_soda

SPはちゃんと保守しているので、signalは大丈夫じゃないかな。

2011-05-26 14:51:28
野良猫@がんばらない @mskwt

Windows はあえて FPO してないんだけどなあ… QT @n_soda: mskwt syuu1228 AoiMoe gccだとomit-frame-pointerっていうオプションがあって、コンパイラが省略できると判断した場合は省略しちゃうんですよ。-Oつけると自動的に

2011-05-26 14:54:31
野良猫@がんばらない @mskwt

その間のレジスタの一貫性について QT @n_soda: SPはちゃんと保守しているので、signalは大丈夫じゃないかな。

2011-05-26 14:54:50
SODA Noriyuki @n_soda

@mskwt あれ、よく分かりません。signalが飛んでくるとレジスタは全部セーブするので、問題ないはずです。シグナルハンドラからlongjmpする場合は、volatile変数以外はsetjmp時の状態に戻るのでこれまた仕様どおりのはずです。他に問題ありましたっけ?

2011-05-26 14:58:21
SODA Noriyuki @n_soda

@mskwt ま、たぶん杞憂ですよ。問題があったらgccのデフォルト最適化オプションに入りっこないので。

2011-05-26 15:07:04