对于下面显示的代码,如果我打印地址,我将得到以下信息。
&test_var1 = 0x7fff0067d87c
&barrier (passed argument) = 0x7fff0067d770
&i (passed argument) = 0x7fff0067d77c
&test_var2 = 0x7fff0067d78c
有两件事我不明白。首先是我读到c将参数从右向左推,然后是how&i大于&barrier。知道堆栈从较高的地址增长到较低的地址,我应该在较低的地址。此外,局部变量test_var2位于更大的地址。
其次,可以预期&barrier和&test_ar1的值很接近,但不,您会看到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;
........
}
最佳答案
在x86上,堆栈(在f()调用g()时使用)向下增长。
无论如何,编译器为某个调用安排var/s的方式取决于实现。