簡體   English   中英

程序如何在這里使用堆棧?

[英]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的方式是實現依賴。

你在這里做了一堆假設,其中沒有一個是真的有理由:

  • 編譯器調用函數時必須推送一些寄存器; 沒有規則說它們不能介於參數和局部變量之間。
  • 沒有規則必須以任何特定的順序推送參數,或者根本不存在它們在堆棧中的事件; 參數也可以在寄存器中傳遞。
  • 內存如何組織成程序堆棧取決於處理器; 在x86架構中,它向下增長,而不是向上增長。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM