簡體   English   中英

C++ Memory 分配器

[英]C++ Memory Allocator

我試圖弄清楚如何制作一個鏈接到單字節數組的鏈表。 所以我放入字節數組的每個元素都可以是 enqued() 和 dequeued()。 但是,我需要弄清楚如何使用指針偏移和鏈表來做到這一點。

我的問題是:如何從指針的開頭獲得設定數量的偏移量? 例如,假設我的列表的開頭是一個指針。 我將首先檢查該空間是否為空,如果不是,則獲取列表中的下一個值。 如何從當前指針 position 偏移並獲得一個新的指針位置,該位置基本上只是另一個指針的偏移量,向前或向后,向上或向下,向左和向右,正負。

有人問了一個例子:

byte myData[1024];

我必須將我的所有數據都存儲到其中。 這是針對 class 分配的。 本質上,我必須使用這個數組來存儲我的所有數據,並且基本上創建一個隊列,就像標准的 c++ 隊列一樣。 我必須創建 Enqueue() 和 Dequeue() 函數,然后為每個函數動態分配 memory。 我對自己在做什么有一個大致的了解。 我一直在試圖弄清楚如何獲取當前 position 的指針,然后將其設置為新的 position,然后將其作為列表中的“下一個”。

聽起來您真正想要的是指針運算。 這很簡單。

std::int32_t foo[] = {42, 350};
std::int32_t* intPtr = &foo;  // We'll say foo is at address 0x005

++intPtr;  // Or intPtr += 1, either way the value of intPtr is now 0x009
           // *intPtr would now give you 350.
           // Your program knows the type being pointed to, and bumps up the address
           // accordingly. In this case a 4-byte integer

在 C 數組上進行指針運算時,重要的是要進行檢查以阻止您在任一側超出范圍。 但是,我什至不認為指針算術是必要的。 如果您要私下存儲數組,只需使用索引訪問並跟蹤列表結束的索引會簡單得多。 您仍然需要進行檢查,但他們的檢查更容易。

您還說鏈表,但描述的是數組列表。 它們是兩種截然不同的數據結構。 如果您編寫一個單獨的數組列表 class 並將數組列表 object 存儲在您的隊列或原始數組中,您的隊列將更容易編寫。

如何從指針的開頭獲得設定量的偏移量?

閱讀有關指針算法的 C++11 標准n3337 注意 C++ 中存在offsetof

如果你有兩個short*ptr1; short*ptr2; 包含有效地址的指針,您可以編碼ptr1 - ptr2ptr1 + 5ptr2 - 3 (但是, ptr1+ptr2是禁止的)。 C++11 標准解釋了何時有效(有時無效,例如當ptr2nullptr時)。 另請注意,一般&ptr1[3]ptr1+3相同,而ptr2[-1]恰好是*(ptr2-1) (如果有意義的話)。

當心代碼中未定義的行為,例如緩沖區溢出(如果您不小心進行指針算術,您將有一個:當心分段錯誤)。

地址清理器、調試器(例如GDB )、 valgrind等工具應該有助於理解代碼的行為。

不要忘記在 C++ 編譯器中啟用警告和調試信息。 一旦您的 C++ 代碼在沒有警告的情況下編譯,請閱讀如何調試小程序 使用GCC ,使用g++ -Wall -Wextra -g編譯。 注意 GCC 10 增加了一些static 分析能力 您可以使用Clang static 分析儀Frama-C (或開發您自己的GCC 插件)。

鏈接列表wikipage 有一個很好的圖。 trie s 上的 wikipage 也可以為您提供幫助。

我建議閱讀一本好的C++ 編程書籍,然后閱讀一些算法介紹

github或其他地方,您可以找到大量與您的問題相關的 C++ 代碼示例(其術語使非英語母語人士感到困惑)。

關於memory 形狀分析的學術論文(例如這一篇那篇)包含可以提高您理解的數字。 有關垃圾收集書籍或 web 資源也相關。

暫無
暫無

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

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