HN 日本語サマリー

← 一覧へ戻る
プログラミング

allocaのような関数はスタックからどのようにメモリを割り当てるのですか?

How do functions like alloca allocate memory from the stack? (devblogs.microsoft.com)

57 pointsby ingve39 コメント

要約

alloca関数は、スタックポインタを調整する前に、スタックプローブのためにコンパイラが使用する_chkstk関数と同じ関数を呼び出します。これは、ローカルフレームを作成する際の初期スタックプローブとallocaの両方に同じ__chkstk関数が使用されることを意味します。

全文翻訳

少し前に、コンパイラが大きなスタック割り当てでガードページをスキップしないようにする方法について話しました。Shawn Van Nessは、これが_allocaでどのように機能するかについて疑問に思っていました。「必要な_chkstk()プローブを実行しますか?」はい、_alloca()関数は、割り当てられたメモリのためにスタックポインタを調整する前に、スタックをプローブするために同じ_chkstk()関数を呼び出します。ここに人工的な例があります: #include <malloc.h> void consume(void*,void*); void f(int n) { char buffer[16384]; consume(alloca(n), buffer); } x86-64では、これは次のような結果になります: push rbp mov eax, 16416 ; probe for local frame call __chkstk sub rsp, rax ; create local frame lea rbp, [rsp+32] movsxd rax, ecx ; n lea rcx, [rax+15] ; round up to multiple of 16 and rcx, -16 mov rax, rcx call __chkstk sub rsp, rcx ; allocate n bytes lea rdx, [rbp] ; rdx -> buffer lea rcx, [rsp+32] ; rcx -> alloca'd memory call consume lea rsp, [rbp+16384] ; clean up local frame pop rbp ret 0 ローカルフレームを作成する際の初期スタックプローブとallocaの両方に、同じ__chkstk関数が使用されていることに注目してください。 2026年8月13日 LPPROC_THREAD_ATTRIBUTE_LISTsを管理するための小さなヘルパークラス Raymond Chen 2026年8月12日 コードに記述されるコメントとプルリクエストの説明に記述されるコメント Raymond Chen