c - 分配给本地堆栈变量的堆栈偏移量是否曾经被重用过,例如,以防它失效或超出范围?
问题描述
换句话说,编译器是否会在程序堆栈中分配足够的空间来存储当前函数中最深的块嵌套级别的所有变量,或者他们是否也会考虑活性和变量的范围?
void zoo(int num) {
if (num) {
int a = foo();
bar(a);
} else {
int b = foo();
bar(b);
}
}
例如,上面的代码将在堆栈上为a
和分配不同的偏移量b
,即使它们只分配了一个偏移量(例如rbp - 8
),它也是合法的。我的问题是,像 gcc 和 clang 这样的编译器会输出为多个变量分配相同静态偏移量的程序集吗?
规范中有关于此的内容吗?
我想知道源变量和编译的汇编文件中存在的堆栈偏移之间是否存在唯一映射。
解决方案
通常,具有自动存储持续时间的对象(在函数或块内定义的“本地”对象)和堆栈偏移之间没有唯一的映射。我已经看到编译器生成的代码为不同的对象重用了相同的堆栈位置,要么是因为在 C 代码中使用一个不重叠使用另一个,要么是因为编译器出于任何目的将一个移入寄存器并且不再需要为其使用堆栈位置。
C 和 C++ 标准不要求实现以任何特定方式实现其堆栈分配。他们可以自由地重用堆栈位置。它们还可以自由分配所有可能需要的堆栈空间1或等待查看是否进入了特定块,然后再为这些块内的对象进一步分配堆栈空间。
笔记
1支持可变长度数组的实现通常必须等到可以确定数组的大小后才能为其分配空间。
推荐阅读
- ios - 如何解决应用商店中的“无效二进制”问题?
- matlab - 如何在 Matlab 中将数据值映射到颜色图/colobar
- python-3.x - 在 Python 中将 doc / docx 文件转换为 pdf
- database - 从 Azure 虚拟机上的 postgresql 断开连接
- python - 用于多种用户类型的 Django DRF OneToOneField
- apache-spark - 如何在 Apache Spark 中设置权限
- bash - 替换特定行中的最后一个单词 sed
- graph - 我正在使用 microsoft graph(使用 .net sdk)创建事件,我发现 2 个事件在邮箱中具有相同的 id
- html - 如何在 blazor 中启用/禁用输入
- embedded-linux - Minio 对象存储服务器是否可以在嵌入式 Linux 平台上移植/运行?