-3

在下面這個for循環在C中的變量x會發生什麼?

int main(){ 
int i; 
for(i = 0;i<4;i++){ 
int x = 1; 
x++; 
} // for close 
}// main close 

這裏變量x這個代碼爲'自動存儲類,對吧?

因此,將變量x創建,我的意思是當遇到語句時會發生內存分配,並在達到循環結束時被破壞並被創建/內存被再次分配爲x

我試圖在循環打印的x地址,它打印相同的地址x每time.So,這是否意味着每一次x被創建和銷燬,並使用相同的房間/內存塊吧?

如果是這樣創建和銷燬,是不是會影響CPU使用率? 如果是這樣,有什麼辦法來防止它,並保持良好的記憶健康?

回答

2

簡答題是「沒有」。任何優化編譯器都會優化這個變量,因爲它永遠不會被讀取。

即使關閉優化器,變量在輸入函數時也會被分配一次,然後在每次迭代中設置爲1,然後是增量。

配置非常便宜,因爲它在自動存儲器中。這個空間是在編譯時決定的,所以在運行時它沒有任何花費。所有迭代都重複使用相同的位置,因此迭代不會產生額外的成本。

+0

優化器的意思是...你的意思是揮發性關鍵字,你的意思是從來沒有讀過什麼!!!!?!?!在此先感謝 – Curiousboy

+0

@Curiousboy優化器是編譯器的最後一個階段,它會計算出指令是否可以重新排序或刪除,以便使代碼更快地運行。通過「從不讀」我的意思是沒有打印或其他表達式使用x值。 – dasblinkenlight

1

是的,該變量是在循環中的每個回合構造和銷燬的。

但是,正如您已經注意到的那樣,編譯器足夠聰明,可以每次爲變量重複使用相同的存儲。可能在堆棧中,輸入函數時可能已經分配了空間。所以沒有必要擔心「內存管理」。

如果你打開一些優化,編譯器也可能會注意到沒有任何變量真的用於任何事情,並刪除所有的代碼。

0

在for循環的每次迭代中,您正在創建變量'x',將其設置爲1,並將其遞增爲2.'x'被破壞,因爲它只存在於for循環中。如果您不希望每次迭代都創建並銷燬它,則可以簡單地在for循環之上聲明它。

你究竟在用這段代碼試圖完成什麼?它似乎沒有太大的作用。另外,由於您擔心內存分配問題,可以在for循環中聲明變量「i」,以便在完成for循環後不會將其掛起。

+0

嗨@ Silamoth,在意義上被摧毀......在退出循環或每次迭代之後? – Curiousboy

+0

每次迭代後,它都被銷燬。換句話說,它會被創建並銷燬4次。然而,正如其他人所說,一個聰明的現代編譯器將最終重用變量及其位置,因爲每次迭代都會重新創建它。 – Silamoth

0

它依賴於實現。你看到相同的內存地址,因爲編譯器決定這樣做。內存在每次迭代之前並不會在新地址處神奇地分配。 x86體系結構中的自動存儲是使用堆棧實現的,分配僅通過減去指向堆棧頂部的ESP/RSP(x86/x64)寄存器完成。你可以在互聯網上閱讀關於它的文章。

編譯器只是重新分配內存每次迭代(不分配/解除分配)

這是你的代碼(GCC 6.3,X86)的裝配上市。彙編語言的評論始於;。我喜歡添加僞C到解釋指令

main: 
     push ebp 
     mov  ebp, esp ; Create new stack frame 
     sub  esp, 16 ; Allocate memory for local variables 
     mov  DWORD PTR [ebp-4], 0 ; i = 0; 
.L3: 
     cmp  DWORD PTR [ebp-4], 3 ; if(i > 3) 
             ; { 
     jg  .L2     ; break; 
             ; } 
     mov  DWORD PTR [ebp-8], 1 ; x = 1; 
     add  DWORD PTR [ebp-8], 1 ; x += 1; 
     add  DWORD PTR [ebp-4], 1 ; i += 1; 
     jmp  .L3 ; Go to location .L3 
.L2: 
     mov  eax, 0 ; Set return value to 0 
     leave ; Restore the stack pointer 
     ret ; Return to the caller 

所以ebp - 8(或int x)地址含義每次都將是一樣的。

這是優化的代碼彙編列表(GCC 6.3, - O3,x86)。

main: 
     xor  eax, eax ; Set return value to 0 
     ret ; Return to the caller 
相關問題