簡體   English   中英

如果沒有指針,堆棧上的內存如何識別?

[英]How is memory on the stack identified if it doesn't have pointers?

如果我錯了,請糾正我,但指針是給每個內存位的標識符(ID)。 如果堆上的內存有指針,則可以識別它,使代碼能夠刪除,修改甚至更改它的大小。 當我讀到一本書說堆棧沒有指針時,就會出現混亂。

我一直在讀“Head First C”這本書,它正在談論指針。 它只是簡單地引用指針作為一個例子嗎? 或者堆棧上的內存是否有某種指向內存的指針?

如果沒有,它是如何識別的? 網絡帖子和書籍之間的混淆或矛盾讓我對一個我只是理解的主題感到困惑。 任何人都可以清除這個嗎?

每個內存位置都有一個地址 沒有什么比你建議堆棧內存沒有地址的想法。

指針值是存儲器位置的地址,指針變量是可以存儲指針值的變量。

堆棧中的數據由堆棧/基址指針的偏移量引用。

執行程序時,操作系統會為其目的分配一塊內存。 然后程序將使用該堆棧來存儲正常執行所需的數據。 請注意,這塊內存可能不是物理內存中的順序內存,而是OS映射的虛擬內存空間。

當一個變量在函數中本地定義時,編譯器將生成代碼,該代碼讀取堆棧中用於表示變量的一大塊數據。 編譯器要小心確保多個變量不會占用相同的空間。 請注意,如果先前的定義在執行流程中被認為是無用的,那么優化編譯器仍然可以為多個變量使用相同的空間(不要與C ++中變量的生命周期有效性混淆)。

但是,只有在編譯時確切知道需要多少內存時,此過程才適用,這意味着編譯器將能夠為程序中定義的每個命名變量生成偏移量。 這意味着不需要顯式讀取內存位置,也就是解引用指針。 但是,這並不意味着變量本身不駐留在內存位置,也沒有可以引用它的地址。

編寫需要動態內存分配的程序時,必須明確告訴操作系統為程序分配更多內存。 由於此存儲器位置是動態的,因此在編譯時將不知道該地址,這意味着只能通過解除引用存儲器位置來完成數據訪問。 在這種情況下,它將是OS分配的額外內存塊。

最后但並非最不重要的是,編譯器可以並且將始終嘗試生成將變量存儲在寄存器中的代碼,因此根據生成的代碼,引用變量可能會有很大差異。

暫無
暫無

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

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