簡體   English   中英

我有點困惑,是在運行時還是在編譯時進行自動內存分配

[英]I'm little bit confused that whether automatic memory allocation takes place during run time or compile time

我知道內存是在編譯時分配給int a;等自動變量int a; 和存儲在堆棧中,但如果是可變數組,其輸入來自用戶,例如

#include<stdio.h>
main()
{
 int n;
 printf("enter the size of array");
 scanf("%d",&n);
 int a[n];
 .......
}

在運行時分配內存。 所以我的問題是,自動分配是否取決於大小寫。 謝謝

在您的示例中,不清楚在何處定義“ a”。 因此,我將通過對此進行假設來回答這個問題。

  1. 如果將數組聲明為全局數組,則它位於bss段中,並在將這些段加載到內存中時分配內存。
  2. 如果數組在堆棧上,並且在編譯時知道數組的大小,則將移動堆棧指針以為數組分配空間。 如果您反匯編代碼,則可以看到此信息。
  3. 如果數組在堆棧上,但是根據函數的參數分配空間,則您具有VLA(可變長度數組)。 這些通常由編譯器轉換為“ alloca”調用。 在這種情況下,堆棧指針僅移至堆棧上已分配的“ n”個字節。
  4. 如果數組在堆上,則分配由使用中的堆分配器執行。

處理自動分配的代碼在編譯時創建。 實際分配在運行時進行。 您將擁有機器代碼,例如“堆棧上的推入變量”或“在寄存器中放入變量”,但是在執行程序之前,該代碼當然不會做任何事情。 所有堆棧分配均在運行時完成。 它們可能具有確定性,也可能不具有確定性。

在VLA的情況下,指令“移動堆棧指針n個步驟”是在編譯時創建的,但是變量n是在運行時設置的,然后堆棧指針相應地移動以分配內存。

唯一一種在編譯時發生的分配是具有靜態存儲持續時間的對象的分配-意味着文件作用域變量和static變量的分配。 在大多數系統上,通常在名為.data.bss的數據段中保留了這些空間。

示例可以在這里找到。

暫無
暫無

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

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