程序如何在这里使用堆栈?

时间:2011-12-23 13:58:14

标签: c linux gcc x86 stack

对于下面显示的代码,如果我打印地址,我会得到以下内容。

&test_var1 = 0x7fff0067d87c
&barrier (passed argument) = 0x7fff0067d770
&i (passed argument) = 0x7fff0067d77c
&test_var2 = 0x7fff0067d78c

这里有两件事我不明白。首先是我读到C从右到左推动参数,然后& i 大于& barrier 。知道堆栈从较高地址增长到较低地址,& i 应该位于较低地址。此外,局部变量 test_var2 甚至更大的地址。

其次,人们会期望& barrier & test_var1 的价值接近,但不会,您会看到268字节的巨大差异。两者之间的堆栈是什么?

请注意,我正在使用优化O3。这是由于那个吗?也许编译器在这里玩了一些技巧?我使用volatile来确保每个变量都在堆栈中,而不是缓存在某个寄存器中。

void some_func()
{
.........
{
  volatile int test_var1 = 0;
}
call_func( i, &barrier );
........
}

void call_func( volatile int i, volatile pthread_barrier* barrier )
{
 volatile int test_var2 = 0;
 ........
}

2 个答案:

答案 0 :(得分:3)

在x86上,堆栈(在f()调用g()时使用)向下增长。

无论如何,编译器为某个调用安排var / s的方式是implementation dependend。

答案 1 :(得分:1)

你在这里做了一堆假设,其中没有一个是真的有理由:

  • 编译器在调用函数时必须推送一些寄存器;没有规则说它们不能介于参数和局部变量之间。
  • 没有规则必须以任何特定的顺序推送参数,或者根本不在它们堆栈的事件中;参数也可以在寄存器中传递。
  • 如何将内存组织到程序堆栈中依赖于处理器;在x86架构中,它向向下,而不是向上。