HN 日本語サマリー

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

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

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

10 pointsby ibobev1 コメント

要約

この記事は、C言語のalloca関数がスタックからメモリを割り当てる仕組みを解説しています。allocaは、コンパイラが生成するスタックフレームのガードページを越えないようにするためのチェック関数_chkstk()を呼び出すことで、安全にメモリを確保します。x86-64アーキテクチャにおけるallocaの呼び出し時のアセンブリコード例を示し、スタック管理の安全性と予測可能性におけるMicrosoftの取り組みを強調しています。

全文翻訳

少し前に、コンパイラが大きなスタック割り当てがガードページを飛び越えないようにする方法について話しました。 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); } On x86-64, this results in 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 ; special __chkstk calling convention 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関数が使用されていることに注目してください。 予測可能で安全なスタック管理アルゴリズムへのMicrosoftの投資を本当に示しています 2026年8月19日 呼び出し可能なものを、同じパラメータで呼び出すだけのラムダにラップすることについて Raymond Chen 2026年8月20日 関数から型依存部分をファクタリングすることでC++テンプレートの肥大化を削減する Raymond Chen 2026年8月20日