2017-02-10 5 views
4

VLAにはスタック上のメモリが割り当てられているため、それらを含む関数をインライン化すれば問題はありますか?私は、allocaの同じ動作のために、つまりスタックにオブジェクトを格納するので、コンパイラはそのような関数をインライン展開するのを避けていると思います(?)。Cでインライン関数を使用するVLA(Variable Length Array)を使用することをお勧めしますか?

+0

関数がインライン化され、スタックに割り当てる必要がある場合、どのような違いがありますか? –

+0

@ A.S.H http://stackoverflow.com/a/3410689/1669844 – user413201

+1

@laxこれはコンパイラのバグIMOとみなされていたはずです。 *セマンティクス*を変更する方法で関数をインライン化するコンパイラは、適合していません。セマンティクスによって、各* alloca *は関数が返ったときに解放され、正しいインライン化はこの意味を尊重しなければなりません。 –

答えて

4

(非標準)alloca関数は、呼び出しが関数であるオブジェクトを生成しますが、VLAの有効期間は宣言されたブロックです。しかし、インライン展開は、どちらにも関係しません。本体がインライン化された関数呼び出しは依然として関数呼び出しであり、allocaによって取得されたオブジェクトは、意味的に戻るときにはなく、CPUがret命令または同等のものを実行するときではなく、存在しなくなります。

-3

私は、VLA(使用している構造体)のスタックに割り当てられたメモリは、どういうわけかインライン関数用に割り当てられたメモリとは異なるメモリ領域であると考えていました。また、インラインコードがコンパイルまたは解釈されるとき、それはプロセッサ/パーサーのためのジョブであり、スタックのためのジョブではありません。要するに、私はそう言いません。

+2

あなたのコメントは困惑しています - なぜVLA用のメモリがスタック以外の場所にあると思うか分かりません。あなたはVLAをどこかに割り当てる実装を知っていますか?そして、私はあなたの文章を '構文解析する'または 'コンパイルする'のが難しいです。 –

+0

申し訳ありませんが、私は非常に明確ではありませんでした。私は間違っているかもしれませんが、別のエンティティのような方法で、VLAは論理的にインラインステートメントで使用されるものと異なるでしょうか? –

+0

オーバーフローJonを防ぐために、論理的に自分自身の割り当てを解除します! –