Xcode將C語言的可變長度陣列放在堆疊上,而不是堆上。
這是否正確?如果是的話,考慮到VLAs應該讓開發者避免malloc-free呼叫,為什么Xcode會這樣做呢?
uj5u.com熱心網友回復:
- 堆疊的設計是為了讓用戶在使用程序中更方便。
- 堆疊被設計為后進先出的記憶體使用。當函式開始時,函式(或嵌套塊)的資料被推入堆疊,當函式的執行結束時,它被從堆疊中移除。
- 分配和釋放很容易。每一個都是通過調整堆疊指標來實作的,它可以很容易地通過變長陣列所需的大小來調整。
用用于malloc的同一個池子的分配來實作它們將是一個問題,因為一個函式并不總是通過回傳來終止。C有setjmp和longjmp功能,允許直接跳轉到呼叫堆疊中的較早位置。longjmp主要可以通過將堆疊指標和程式計數器設定為執行setjmp時的值來實作,這些值被存盤在setjmp背景關系物件中。如果可變長度的陣列是從malloc池中分配的,那么就有必要在堆疊中穿過所有級別的呼叫樹,找到在每個級別中分配的可變長度的陣列,并釋放它們。而這意味著我們也有必要在堆疊樹中創建這些分配的記錄,因為它們是被分配的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/324720.html
標籤:
