realloc可能只是在這里和那里更新簿記資訊以增加您的分配大小,或者它實際上可能是malloc一個新的和memcpy以前的分配(或可能失敗)。
我希望能夠查詢記憶體管理器是否可以簡單地調整分配大小(因為它保留的比我多,malloc或者因為它能夠合并相鄰的塊等......),如果是,那么我會要求它繼續前進,這樣做,否則我會想malloc和memcpy原來分配的自己任意順序任意子集。
其他 StackOverflow 答案似乎是以下四個之一:
realloc反正建議。對于大量資料,這可能非常低效,其中雙拷貝會產生嚴重影響。通常,它是最快的便攜式路由。- 推薦手動
mallocmemcpyfree。這更糟糕,因為現在不是在分配可能不會調整大小時進行一些雙重復制,而是每次分配填滿時都進行雙重復制。表現很糟糕。 - 建議特定于平臺的擴展。這是不切實際的,因為我的代碼和很多 C 代碼一樣,需要可移植性。
- 建議不可能。C 已經假定存在一個記憶體管理器,它能夠調整分配的大小或創建一個新的分配。那么,為什么我不能對其進行更高級別的控制呢?我們可以對齊 malloc;為什么不是這個?
注意:這個問題同時發布在 C 和 C 標簽下,因為來自任何一種語言的解決方案都是可以接受和相關的。
編輯 1:
用 FB 向量的話來說:
但是等等,還有更多。許多記憶體分配器不支持就地重新分配,盡管它們中的大多數都可以。這來自現在臭名昭著的 realloc() 設計,它不透明地執行就地重新分配或分配-記憶體-解除分配回圈。這種缺乏控制隨后迫使所有基于 clib 的分配器設計避免就地重新分配,其中包括 C 的 new 和 std::allocator。這是效率的重大損失,因為非常便宜的就地重新分配可能意味著不太積極的增長戰略。反過來,這意味著更少的空閑記憶體和更快的重新分配。
看到這個。
uj5u.com熱心網友回復:
無論如何建議重新分配。對于大量資料,這可能非常低效,其中雙拷貝會產生嚴重影響。
由于原因為什么的realloc有時會避免復制和分配,這是一個不相關的點,因為在實際實施時,這個條件并不大批量資料的存在。如果您知道分配很大,那么可以相當安全地假設 realloc 必須復制和分配。因此,您無需進行“不可能”檢查即可做出選擇。
如果重新分配是可選的并且您負擔不起副本,則無條件選擇不重新分配的選項。如果重新分配不是可選的,那么重新分配是否會復制和分配對您必須執行的操作沒有影響。
建議特定于平臺的擴展。這是不切實際的,因為我的代碼和很多 C 代碼一樣,需要可移植性。
這是實作您所要求的唯一方法,因為沒有標準方法來查詢 realloc 是否會復制和分配。
但是,請記住,可以通過使用預定義的宏有條件地禁用此功能來移植此類代碼。
建議不可能。
如果您選擇依賴標準 C ,這就是事實。
有沒有辦法做到這一點,而我在搜索中沒有遇到過?
不,清單是詳盡無遺的。
uj5u.com熱心網友回復:
的標準存盤器介面是有據可查的。如果您想要某些不屬于該界面的功能,您的解決方案將是自定義的、第三方的或特定于平臺的。
- 建議不可能。C 已經假定存在一個記憶體管理器,它能夠調整分配的大小或創建一個新的分配。那么,為什么我不能對其進行更高級別的控制呢?
因為它不是標準介面的一部分。這事實上可能已經進行了標準介面的一部分,并不意味著是是標準介面的一部分。
... 我們可以對齊 malloc;為什么不是這個?
如果您希望它在標準中,請向作業組提出更改。它不會很快到達。
如果你想要的東西作業,現在,你需要撰寫自己的分配器或找到能滿足你需求的第三方之一。
注意
- 建議特定于平臺的擴展。這是不切實際的,因為我的代碼和很多 C 代碼一樣,需要可移植性。
不是一個真正的問題(或者至少是一個人們經常應付的問題)。您可能必須為要支持的每個平臺撰寫不同的實作(并退回到realloc沒有更好的地方),但這對于跨平臺代碼并不少見。
uj5u.com熱心網友回復:
我想你想要的是在你的 malloc 記憶體塊之后的空閑空間的大小。有可能,記憶體管理器在每個塊之前預留了一個頭,你可以從塊頭中得到你想要的資訊,但由于各種記憶體管理器的實作不同,顯然它是不可移植的。我認為更好的方法是使用記憶體池自己管理堆記憶體,它會更高效和便攜。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/363012.html
