簡體   English   中英

char buf[100] 是否分配了任何 memory?

[英]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.

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