返回

文章详情

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

Hacker News2026年8月17日 21:06

不久前,我谈到了编译器如何确保大栈分配不会跳过保护页。肖恩·范·内斯对 _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 请注意,同一个 __chkstk 函数既用于在创建局部帧时执行初始栈探测,也用于 alloca()。作者雷蒙德参与了 Windows 的发展已超过 30 年。2003 年,他开始了一个名为 The Old New Thing 的网站,后来这个网站的受欢迎程度远远超出了他的想象,这一发展至今仍让他感到不安。这个网站催生了一本书,巧合的是也名为 The Old New Thing(Addison Wesley 2007)。他偶尔会在 Windows 开发文档的 Twitter 账号上出现,讲述一些没有任何实用信息的故事。

赞助内容

NordVPN Next-gen Antivirus

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

请我喝杯咖啡