即使沒有優化,內存中變量的排序通常也不是您可以指望的。無論如何,它們最終的順序取決於你如何看待它們。如果你看到一羣人從最短到最高排列,他人可能會說這些人實際上是從最高到最短。
影響這些變量在內存中的順序的第一件事就是編譯器如何實現。它有一個列表,列表可以從頭到尾或從頭到尾進行處理。所以編譯器讀取你的代碼,產生中間代碼,這個中間代碼有一個需要放在堆棧上的局部變量列表。編譯器並不關心它們在代碼中的順序,所以它只是以最方便的順序查看它們。
第二件事是許多處理器使用一個顛倒的堆棧。如果你:
push A
push B
然後A有一個比B更大的地址,儘管B位於堆棧的頂部(並在A之上)。想象這樣的一個好方法是使用C數組:
int stk[BIG];
int stk_top = BIG;
然後
void stk_push(int x) {
stk_top--;
stk[stk_top] = x;
}
正如你可以看到stk_top指數實際上縮小爲堆棧得到它更多的項目。
現在回到優化 - 編譯器在重新排序不在結構中的事物時非常自由。這意味着你的編譯器可以很好地對堆棧中的局部變量進行重新排序,並且在那裏添加額外的填充字節來保持對齊。另外,編譯器也可以自由地將一些局部變量放在堆棧中。僅僅因爲你命名了一個局部變量並不意味着編譯器必須在程序中真正生成它。如果一個變量沒有被實際使用,它可能會被排除在程序之外。如果一個變量被大量使用,它可能被保存在一個寄存器中。如果一個變量只用於程序的一部分,那麼它可能只是臨時存在,並且它所使用的內存可以在該函數期間在幾個其他臨時變量之間共享。
@abelenky:哎呀...謝謝你注意到:)修正了它。 – Legend 2010-10-20 16:05:38
請記住,如果編譯器發現它們是有益的,那麼它們甚至可能不會被放置在堆棧上,它們中的一些可能被存儲在寄存器中整個生命週期中。 – nos 2010-10-20 16:14:08
限制變量內存佈局,你應該把它們打包在一個'結構'中。在你的例子中,編譯器只是按照聲明的順序將它們放到堆棧上,而堆棧則按照相反的順序被使用。 – valdo 2010-10-20 16:30:43