allocaと可変長配列

スタックに配列を置きたい。その壮大すぎる願いに支払われる対価のお話。
10
野良猫@がんばらない @mskwt

ところでさ、type name[variable] って C++ で許されていたっけ?gcc 拡張?

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

@mskwt C99なので、C++で使えたらgcc拡張。

2011-05-26 14:05:53
SODA Noriyuki @n_soda

@mskwt C99規格から可能になりました

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

array ってわけにもいかないから、全部 std::vector<> に書き直したわけだが。

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

. @n_soda @egtra ああ、やっぱり g++ 拡張?本当にやめてほしい…。VC++ 拡張も死ねくらいに思っているので。

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

こんな低レベルな領域確保について、資料嫁だの twitter で問い合わせる (応答 thx lot!) という構図が、C の終わりを告げている気がするんだよなあ…

2011-05-26 14:08:30
SODA Noriyuki @n_soda

@mskwt @egtra gcc拡張ではありません。C言語1999年版の標準機能です。

2011-05-26 14:09:36
SODA Noriyuki @n_soda

@mskwt @egtra あれ、C++部での話ですか?

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

元は gcc 拡張じゃなかったの? QT @n_soda: mskwt egtra gcc拡張ではありません。C言語1999年版の標準機能です。

2011-05-26 14:10:40
Egtra (ysk-noh) @egtra

_allocaに書き換える→sizeof使われていてお手上げ(vectorへ)なんて覚えもある。

2011-05-26 14:12:16
SODA Noriyuki @n_soda

@mskwt なるほど。で、あればg++拡張でしょうね。 @egtra さんの書かれた通りです。

2011-05-26 14:22:07
くまぎ @kumagi

http://ideone.com/hdFnz スタック上に好きな長さの配列置けるってこれ地味に画期的な機能な気がするんですけど…。ヒープ触らずに済むとか素敵過ぎる。

2011-05-26 14:15:17
Akihiro Nomura / きつね @sacred_fox

@kumagi alloca(3)じゃだめなの? というLinux+C(not C++)脳

2011-05-26 14:18:07
くまぎ @kumagi

@kikairoya @scared_fox allocaを知らなかったです。実行時にサイズはわかるんだけど上限は規定できなくて…っていう場面で泣く泣くヒープを使ってたので今度からallocaを使おうと思います。

2011-05-26 14:20:25
中村 実 @nminoru_jp

@kumagi @kikairoya @scared_fox いや可変長配列で済むなら、allocaより可変長配列を使う方がいいと思いますよ。

2011-05-26 14:30:23
くまぎ @kumagi

@nminoru_jp それはgcc上でなら安心して動くから、ということでしょうか?

2011-05-26 14:38:14
中村 実 @nminoru_jp

@kumagi 可変長配列はC99の仕様なのでコンパイラを問わずに使えると思います。VLAはallocaよりpointer aliasを減らせる点が有利です。ただ私が勘違いしていたのですがC++は仕様としてVLAが使えないので、C++ならallocaを使う方が行儀がいいです。

2011-05-26 15:09:45
pepshiso @pepshiso

@kumagi allocaでサイズの上限なしのメモリをとるとスタックオーバーフローで死ぬんじゃ……。

2011-05-26 14:21:42
くまぎ @kumagi

@pepshiso その時はライブラリ使用者の責任ということで許してもらいたいです。

2011-05-26 14:26:58
鯉江 @koie

@kumagi すごく便利なのはたしか。でもスタックオーバーフローが恐いです。

2011-05-26 14:18:06
SODA Noriyuki @n_soda

@koie @kumagi まあそれ言い出すと再帰だって使えなくなるわけで、スタックサイズを見積もって対策とるのはプログラマの責任ですな。あんまりでかい配列はとっちゃ駄目でしょう。

2011-05-26 14:23:19
くまぎ @kumagi

@n_soda @koie そうですね「速度を優先してこういう選択をしたから使うときに気をつけてね」で済む話になってもらいたいです。

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

alloca とか、user stack が thread-safe である以上、thread-safe だからなあ (例外はありそうな気がする)

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

@n_soda いやあ、そういうのを使われると辛くて…。C as C99 なんてやるべきじゃないです。

2011-05-26 14:24:50