0

alloca()指定されたサイズが0の場合、NULLを返しますか?

alloca(0)すばやく検索すると、場合によってはガベージコレクションが強制されることがわかり ます。しかし、私は主に戻り値に興味があります。

ありがとう

4

4 に答える 4

2

このマンページによるとalloca、はスタックにメモリを割り当て、成功するか、プログラムをクラッシュさせます。

ここで、0バイトの割り当ての場合、戻り値について気にする必要はありません。0バイトがあるため、書き込むスペースがなく、返されたポインター値が0x1234NULLであるかどうかに関係なく、プログラムはとにかくクラッシュするはずです。 。

于 2011-11-07T13:07:27.310 に答える
2

allocaのgcc-2.95実装は、malloc自体を使用してヒープからメモリを割り当てます。その実装のコンテキストでは、alloca(0)は次と同等ですfree (/*all the memory that was allocated with alloca when the stack pointer was deaper*/)。これは、gcc-2.95のalloca.cファイルの解説からの引用です。

この実装の一般的な概念は、割り当てられたすべてのブロックを追跡し、現在の呼び出しよりもスタックの奥深くにあることがわかったブロックを再利用することです。このヒューリスティックは、無効になるとすぐにストレージを再利用しませんが、最終的には再利用します。

特別な場合として、alloca(0)は何も割り当てずにストレージを再利用します。メインの制御ループなどでalloca(0)を使用して、ガベージコレクションを強制することをお勧めします。

ちなみに、この実装では、alloca(0)はNULLを返します。

于 2017-01-31T10:09:47.510 に答える
1

Linuxのmanページによると

に準拠

この関数はPOSIX.1-2001にはありません。

ノート

alloca()関数は、マシンおよびコンパイラーに依存します。

したがって、0サイズの要素をalloca()することは合法ではありませんが、定義されていません

size=0の場合の戻り値の具体例はありません。この質問と最初のリンクの「GNUバージョンに関する注意事項」をご覧ください。

于 2011-11-07T13:25:50.457 に答える
1

Windowsでは_alloca(0); 、スタックポインタを返しますRSP(一定のオフセットを使用)。これは、Cコードがプロセス内からCPUレジスタを認識する必要がある例外的な状況で必要になる場合がありx64ます(インラインアセンブリはVisual Studioの64ビットビルドではサポートされていないため) 。)

ただし、呼び出す_alloca(0);とスタックにメモリが割り当てられるため、同じローカルスコープで繰り返し呼び出さないように注意してください。そうしないと、スタックが使い果たされてstack overflow例外が発生する可能性があります。

はるかに優れた代替手段として、_AddressOfReturnAddress()代わりに組み込みを呼び出すことを検討してください。

于 2017-12-05T09:21:04.077 に答える