哪些 C/C 编译器可以利用 Push/Pop 指令来创建局部变量?
简介
与逐渐增加 ESP 的常见做法相反,这个问题深入探讨了使用push和pop指令建立局部变量的可能性,旨在优化代码紧凑性和可能的性能。
编译器注意事项
编译器优化:
堆栈引擎优化:
代码示例
考虑以下示例:
int extfunc(int *, int *); void foo() { int a=1, b=2; extfunc(&a, &b); }
编译器输出
GCC、ICC、MSVC 和 clang 都会生成以推送指令开头的代码,然后是堆栈操作和对 extfunc 的调用。这与现代编译器利用推送进行优化的观察结果一致。
最佳解决方案
进一步优化的解决方案是:
push 2 # only 2 bytes lea rdi, [rsp + 4] mov dword ptr [rdi], 1 mov rsi, rsp # special case for lea rsi, [rsp + 0] call extfunc(int*, int*) pop rax # alternative to add rsp,8 ret
在这种情况下,单个入栈指令会为两个局部变量分配空间,同时使堆栈保持 16 字节对齐。这可以优化代码大小并保持效率。
其他注意事项
以上是现代 C/C 编译器是否利用 Push/Pop 指令进行高效的局部变量管理?的详细内容。更多信息请关注PHP中文网其他相关文章!