【发布时间】:2014-11-26 19:37:12
【问题描述】:
假设函数参数将在堆栈上按顺序传递是否安全?
例如,无论编译器设置如何,foo 是否保证输出x y z?
void foo(int x, int y, int z) {
int *vector = &x;
for(int i = 0; i < 3; i++) {
std::cout << vector[i] << " ";
}
}
我在 Visual Studio 中尝试过,它确实有效,但我不确定这种行为是否得到保证。
【问题讨论】:
-
输出:
1137301924432767,简短回答:NO -
不,理论上这是未定义的行为。在实践中,
calling conventions确定参数的传递方式,并且在不同平台上可能有所不同(跨 API 调用时,编译器在自包含编译单元内执行的操作可能与 call-to-call 不同)。 -
@πάνταῥεῖ 关闭这个不是一个真正的问题!哦等等……
-
此外,即使您可以通过这种方式以明确定义的方式读取堆栈,也不在许多真实计算机上打印
x y z。y和z可能位于vector[-1]和vector[-2](取决于堆栈增长的方向),或者参数可能在寄存器中传递(将x复制到堆栈以使其具有地址) . -
当我尝试它时这对我有用,我想知道这是否总是如此,以及这是否是一个安全的假设。我不明白这怎么跑题了。
标签: c++ language-lawyer undefined-behavior