为什么我的缓冲区在堆栈上分配的内存比我要求的多?

互联网 行业动态 更新时间:2024-06-13 00:19:32

Nat*_*dge 5

我猜您正在使用 g 并在没有优化的情况下进行编译,例如(godbolt)。

这里有几件事:

首先,在没有优化的情况下编译时,编译器会尝试确保每个局部变量在内存中都有一个地址,以便调试器可以轻松地检查或修改它。这包括函数参数,这些参数在 x86-64 上以其他方式在寄存器中传递。因此编译器需要分配额外的堆栈空间,其中argcargv参数可能会“溢出”。您可以在程序集的第 5 行和第 6 行看到溢出:

        movl    %edi, -516(%rbp)
        movq    %rsi, -528(%rbp)

如果您仔细看,您可能会注意到编译器将argc(from ) 放置在原本可用%edi的地址上,从而浪费了 4 个字节。不完全清楚为什么,但毕竟,它没有优化!这样我们就达到了 516 个字节。-516(%rbp)-520(%rbp)

另一个问题是 x86-64 ABI 需要 16 字节堆栈对齐;请参阅为什么 x86-64 / AMD64 System V ABI 要求 16 字节堆栈对齐?. 在这种情况下,长话短说,这意味着我们的堆栈调整需要是 16 字节的倍数。(返回地址和 pushrbp再增加 16 个字节,这不会干扰这种对齐。)所以我们的 516 必须四舍五入到 16 的下一个倍数,即 528。

如果编译器更加小心并且不浪费 和 之间的 4 个字节argcargv我们可以只用 512 个字节就可以了。但是,使用 528 的一个好处是缓冲区str最终以 16 字节对齐。char对于最小对齐仅为 1的 数组,这不是必需的,但它可以使字符串函数更高效,例如strcpy使用快速 SIMD 算法。我不确定编译器是故意这样做还是只是巧合。

更多推荐

堆栈,缓冲区,比我,分配,内存

本文发布于:2023-04-21 09:51:09,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/hyzx/7c8c0ab0efde0f2ea97abf3f76192009.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:堆栈   缓冲区   比我   分配   内存

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!