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

标签 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;
 ........
}

最佳答案

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

无论如何,编译器为某个调用安排 var/s 的方式取决于实现。

关于c - 程序在这里如何使用堆栈?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8616909/

相关文章:

c - 递归函数; "...has stopped working"

python - 在接口(interface)启动时,可以扫描特定的 MAC 地址吗?

c - 当程序未链接到 pthreads 库时,为什么 pthread_mutex_lock 总是返回 0(但没有错误)?

python - Python 的 C++ 编译器支持 C++11(MinGW 和 MSVC)(也是 cl.exe fatal error )

c - 对 gdk_pixbuf_new_from_file_utf8 的 undefined reference

c - 指向二维数组的指针

c - 使用 MPI_Irecv 和 MPI_Test 的无限循环

android - Android Studio 在 Linux PC 上运行速度更快吗?

linux - 尝试在我的 shell 脚本中实现 CASE

c - 安装OpenCV并使用GCC编译C程序