[英]How is the program using the stack here?
对于下面显示的代码,如果我打印地址,我会得到以下内容。
&test_var1 = 0x7fff0067d87c
&barrier (passed argument) = 0x7fff0067d770
&i (passed argument) = 0x7fff0067d77c
&test_var2 = 0x7fff0067d78c
这里有两件事我不明白。 首先是我读到C从右到左推动参数,然后是&i大于和障碍 。 知道堆栈从较高地址增长到较低地址, &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;
........
}
在x86上,堆栈(当f()调用g()时使用)向下增长。
无论如何,编译器为某个调用安排var / s的方式是实现依赖。
你在这里做了一堆假设,其中没有一个是真的有理由:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.