返回

文章详情

像 alloca 这样的函数如何从栈中分配内存?

Hacker News2026年8月28日 13:54

不久前,我谈到了编译器如何确保大栈分配不会跳过保护页。肖恩·范·内斯对 _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 ; special __chkstk calling convention 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 函数。作者雷蒙德从事 Windows 的开发已超过 30 年。2003 年,他开始了一个名为 The Old New Thing 的网站,该网站的受欢迎程度远超他想象,这一发展至今仍让他感到不安。该网站催生了一本书,巧合的是也命名为 The Old New Thing(Addison Wesley 2007)。他偶尔会在 Windows Dev Docs 的 Twitter 账号上出现,讲述一些并没有提供有用信息的故事。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡