[英]Does char buf[100] allocate any memory?
char buf[100]
行是否在堆棧中分配了任何 memory? 我假設它不是因為它只是一個聲明。 當我在運行下面兩個不同的代碼段后打印 buf 的地址時(一個用“test”填充 buf,另一個用“test test”填充),我得到不同的地址。 這是否意味着 buf 實際上不是 100 個字節,而在第一種情況下只有 5 個字節(null 字符為 +1),而在第二種情況下只有 10 個字節?
char buf[100];
strcpy(buf, "test");
對比
char buf[100];
strcpy(buf, "test test");
C 標准使用抽象機器的 model 定義了 C。 當char buf[100];
出現在 function 中,它在該抽象機器中定義了一個 100 個char
的數組。 從概念上講,為該機器中的數組保留了 100 個字節,並且程序行為的所有描述都如同為數組保留了這 100 個字節一樣。
當 C 編譯器實現具有該定義的程序時,不需要盲目地實現抽象機。 它可以切掉機器不使用的部分。 如果不使用全部 100 個字節,則允許編譯器僅使用使程序工作實際需要的物理量 memory。
為此,“工作”意味着實際程序產生與抽象程序相同的可觀察行為。 可觀察的行為包括輸入/輸出交互、對易失性對象的訪問以及對文件的 output。 如果編譯器可以通過使用寄存器而不是主 memory 來獲得所需的可觀察行為,則它根本不必對數組使用主 memory。 如果確實使用 memory,則允許使用堆棧 memory 或其他 memory。
在實踐中,如果buf
的使用足夠簡單,編譯器可以“看到”和“理解”你使用它所做的一切,它可能會消除部分或全部。 如果將buf
傳遞給當前翻譯單元之外的另一個例程,編譯器無法查看它是否真的被使用,因此它必須為其保留 100 個字節,通常在硬件堆棧上,以防其他例程確實使用所有的buf
。 (鏈接時優化可以實現跨多個翻譯單元的優化,但這仍然是開發技術,不太可能消除在堆棧上分配這樣的緩沖區——除非它可以看到你分配緩沖區的例程是不需要的,它可以完全消除常規。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.