爲了方便起見,我只是使用純文本的示例。例如,對於句子I have a cat
,我需要malloc
變量的char
13個插槽,以便它將所有字母與最終的\0
一起存儲。如何管理內存插入和刪除內容?
但是,如果現在我想在cat
之前插入lovely
?看起來我必須創建一個足夠大的新陣列並複製所有內容。
更糟糕的是,由於計算機上添加了多少東西是不可預知的,因此似乎我必須在每次添加一個新字母時重做malloc和複製東西,也就是說,對於每個字母l
o
v
e
l
y
,結果不是一個聰明的解決方案。 (電腦提前不知道'可愛'這個詞,呃?)
「更好」的解決方案似乎是在第一個地方創建了一個足夠大的數組,這樣每次插入一個新的字母時,程序只複製並移動它後面的所有內容。但是,這仍然是低效率的,特別是當文檔很長時,我從一開始就添加了一些東西。
這同樣適用於'刪除',每次刪除一個字母時,我必須複製一切後面的所有內容並縮小數組大小。
使用節點而不是數組來存儲內容似乎是一個同樣糟糕的解決方案,就像現在每次我想在內容中間做一些事情一樣,我必須從頭開始一直走路。
那麼在這種情況下管理內存的正確或有效的方法是什麼?我想要在C這樣的低級別編程的答案,這需要直接內存分配和解除分配,而不需要「魔術」功能或庫,它們已經可以爲您處理所有事情。
如果你問十個人,你會得到十個不同的答案。我們需要更多關於您的場景的信息。什麼是關鍵因素?性能有多重要,您是否知道整個流程或空間需要的內存總量?你多久會期望這些東西成長等等。人們寫下PH。D在這個問題上。這就是說一些經典的想法是循環緩衝區,指數增長。如果連續內存不是問題,那麼您可以查看其他表示,例如鏈接列表和樹......但這取決於您的要求。 – UpAndAdam
我認爲關鍵因素是能夠快速插入/刪除內容。內存總量可能無法預測,因爲容量應根據需要增長。你可以將它想象成類似於文檔編輯器的東西,你可以快速進入段落中的任何地方並在那裏插入/刪除東西,而且你不知道用戶的文字會是多長時間,對吧?這是一個類似的場景。 – OneZero