嵌入式指針embedded pointer的概念以及用法

目錄

    • 前言
    • 概念
    • 用法
    • 參考

前言

在針對一個class寫出它的內存管理池以及總結出allocator類(三個版本)中內存管理池的第二個版本中涉及到了一個非常重要的概念:嵌入式指針。同時嵌入式指針也在G2.9版本的alloc中出現。現在整理一下網上的一些用法和概念

概念

嵌入式指針工作原理:借用A對象所占用的內存空間中的前4個字節,這4個字節用來 鏈住這些空閑的內存塊;
但是,一旦某一塊被分配出去,那么這個塊的 前4個字節 就不再需要,此時這4個字節可以被正常使用;
從工作原理中可以看出嵌入式指針使用前提:類A對象的sizeof必須不小于4字節。

用法

什么時候會用到next指針呢?

  1. 第一次分配對象,建立整個freeStore的鏈表的時候,初始化各個實例的next指針
  2. 每次給申請者一個實例時,要修改freeStore = freeStore->next
  3. 每次歸還一個實例時,鏈表插入操作要用到next.

next指針的使用都是在申請和歸還的時候,也就是說申請者在使用這塊內存的時候從來都不需要next.
既然next指針所占的4個字節不會被同時使用,那我們可以通過union,讓使用時和申請/歸還重用同一塊內存。
下面是具體代碼:

class CMyObject
{
private:struct CMyObjectRep{int   _data1;char  _data2;};
private://注意,這里是個匿名的union,我們把使用期的成員變量都放在一個結構里面union{CMyObjectRep rep;  // 使用期會用到的成員變量CMyObject* next;   // 分配,歸還時使用的,服務于空閑鏈表操作};
public://其他都和簡單的空閑鏈表的實現一模一樣
}

再看一下另外一個參考代碼:
struct里放了一個指針,它的大小為4個字節。這個指針的值,存著下一個內存的地址。由于這里只需要指針,所以union可以不使用。

#include<iostream>
using namespace std;
class TestEP
{
public:int m_i;int m_j;public:struct obj //結構        //定義一個類型,不放在外部,污染全局變量{//成員,是個指針struct obj* next;  //這個next就是個嵌入式指針//自己是一個obj結構對象,那么把自己這個對象的next指針指向 另外一個obj結構對象,最終,把多個自己這種類型的對象通過鏈串起來;};
};int main()
{TestEP mytest;cout << sizeof(mytest) << endl; //8TestEP::obj* ptemp;  //定義一個指針ptemp = (TestEP::obj*)&mytest; //把對象mytest首地址給了這個指針ptemp,這個指針ptemp指向對象mytest首地址;cout << sizeof(ptemp->next) << endl; //4cout << sizeof(TestEP::obj) << endl; //4ptemp->next = nullptr;}

不過很奇怪我在我的編譯環境下結果都是8.。。。

參考

內存分配(2)–embedded pointer
C++11/14之內存池改進版
感覺兩者都是參考了侯捷老師的內存管理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/377345.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377345.shtml
英文地址,請注明出處:http://en.pswp.cn/news/377345.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CLI配置和編址

實施基本編址方案&#xff1a; 在設計新網絡或規劃現有網絡時&#xff0c;至少要繪制一幅指示物理連接的拓撲圖&#xff0c;以及一張列出以下信息的地址表&#xff1a; l 設備名稱 l 設計中用到的接口 l IP 地址和子網掩碼 l 終端設備&#xff08;如 PC&#xff09;的默…

sql語句中的in用法示例_PHP中的循環語句和示例

sql語句中的in用法示例循環 (Loops) Imagine that we need a program that says "hello world" 100 times. Its quite stressful and boring to write the statement -- echo "hello world" — 100 times in PHP. This is where loop statement facilitate…

love2d教程30--文件系統

在游戲里少不了文件操作&#xff0c;在love2d里我們可以直接用lua自帶的io函數&#xff0c;如果不熟悉可以先讀一下我的lua文件讀寫。 相對lua&#xff0c;love2d提供了更多的函數&#xff0c; 方便我們操作文件。不過可能處于安全考慮&#xff0c;love2d只允許我們訪問兩個目錄…

std::alloc具體細節

G2.9 std::alloc的缺點&#xff1a; 1、在alloc::deallocate中沒有將拿到的內存資源還給操作系統&#xff0c;在多任務中將占用很大資源 2、alloc::deallocate函數沒有檢查傳入的p指針的有效性。在這里它默認p為alloc::allocate取得。 如果p并非alloc::allocate取得&#xf…

修改函數的返回地址

這篇隨筆源自今天看的這篇文章http://www.cnblogs.com/bluesea147/archive/2012/05/19/2508208.html 1. 如何修改函數返回地址 今天主要寫測試程序思考和驗證了一下這個問題&#xff0c;先看一下這個&#xff23;程序 1 #include <stdio.h>2 void foo(){3 int a,…

調試JavaScript代碼

JavaScript調試代碼 (JavaScript debugging the code) Debugging is the process of finding mistakes or bugs in the program. There are several ways one can debug their JavaScript code. This article will walk you through the strict mode in JavaScript and excepti…

Delphi運算符及優先級

單目運算符 (最高優先級) 取變量或函數的地址(返回一個指針) not 邏輯取反或按位取反 乘除及按位運算符 * 相乘或集合交集 / 浮點相除 div 整數相除 mod 取模 (整數相除的余數) as 程序運行階段類型轉換 (RTTI運算符) and 邏輯或按位求和 shl 按位左移 shr 按位右移 加減運算符…

NotifyMyFrontEnd 函數背后的數據緩沖區(二)

message level 函數pq_putmessage調用 low level 函數 pq_putbytes,pq_putbytes調用 internal_putbytes。 從internal_putbyes上來看&#xff0c;就可以發現其數據發送的機制:有一個小技巧&#xff0c;如果數據緩沖區滿了&#xff0c;就發送&#xff0c;否則就先堆在那兒。如果…

從源碼角度剖析VC6下的內存分配與切割的運作

目錄前言1、heap初始化2、第一次分配內存&#xff0c;計算真正區塊大小3、new_region管理中心4、__sbh_alloc_new_group()切割第一次分配好的內存5、開始切割內存前言 malloc與free帶來的內存管理是應付小區塊的&#xff0c;即SBH(small block heap)&#xff0c;這點也可以從源…

windows常見命令整理(持續更新)

windows常見命令整理 1. 文件1.1. 實時顯示文件 logfile.txt 中新添加的內容&#xff08;類似于linux tail -f&#xff09; 2. 網絡2.1. netstat 3. 進程和任務3.1. tasklist &#xff08;用于列出當前運行的進程及其詳細信息&#xff09;3.2. wmic &#xff08;用于執行各種系…

最長公共子序列求序列模板提_最長公共子序列

最長公共子序列求序列模板提Description: 描述&#xff1a; This question has been featured in interview rounds of Amazon, MakeMyTrip, VMWare etc. 這個問題在亞馬遜&#xff0c;MakeMyTrip&#xff0c;VMWare等訪談輪次中都有介紹。 Problem statement: 問題陳述&…

洛必達法則使用條件

使用條件 1、分子分母同趨向于0或無窮大 。 2、分子分母在限定的區域內是否分別可導。 3、當兩個條件都滿足時&#xff0c;再求導并判斷求導之后的極限是否存在&#xff1a;若存在&#xff0c;直接得到答案&#xff1b;若不存在&#xff0c;則說明此種未定式無法用洛必達法則解…

求根號m(巴比倫算法)

巴比倫算法是針對求根號m的近似值情況的&#xff0c;它的思想是這樣的&#xff1a; 設根號mX0,則如果枚舉有答案X(X<X0)&#xff0c;則m/X>X0,當精度要求不高的時候&#xff0c;我們可以看成Xm/XX0,而如果精度要求比較高&#xff0c;我們只需取X和m/X的平均值作為新的枚舉…

Android面試題

http://blog.csdn.net/aomandeshangxiao/article/category/841452 http://www.cppblog.com/life02/category/18316.html轉載于:https://www.cnblogs.com/DonkeyTomy/articles/2598673.html

r語言 分類變量 虛擬變量_R語言中的變量

r語言 分類變量 虛擬變量R語言| 變數 (R Language | Variables) In the previous tutorial, we have come across the basic information that stands as a pavement for understanding the R language in depth. Now moving future let us educate ourselves about the concep…

算法題復習(快排、鏈表、二分、哈希、雙指針)

目錄1、快速排序復習2、鏈表部分復習203. 移除鏈表元素707. 設計鏈表206. 反轉鏈表142.環形鏈表 II3、二分法復習4、哈希法復習5、雙指針復習**15. 三數之和****18. 四數之和****27. 移除元素****344. 反轉字符串**,簡單&#xff0c;雙指針從兩側往中間靠攏&#xff0c;并隨時s…

Cassandra1.2文檔學習(7)—— 規劃集群部署

數據參考&#xff1a;http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/architecturePlanningAbout_c.html 當規劃一個Cassandra集群部署時&#xff0c;關于你初始存儲的數據的數據量你應當有一個好的想法&#xff0c;并且對于…

虛擬機設置NAT

需要開啟虛擬機網絡相關服務&#xff0c; 安裝虛擬網卡&#xff0c; 還有必須安裝 VMware ToolsVMware虛擬機下實現NAT方式上網1. 把你的虛擬網卡VMnet8設置為自動獲得IP、自動獲得DNS服務器&#xff0c;啟用。2. 把你虛擬機中操作系統的“本地連接”也設置為自動獲得IP、自動獲…

窗體震動 C# (不使用Timer控件,控制窗體震動)

private static Point plocation new Point(); public static void StartVibration(Form form)//Form 傳入需要振動的窗體 { plocation form.Location; for (int i 1; i < 41; i)//41&#xff0c;可以理解為震動的時間。…

算法題復習(棧與隊列、二叉樹)

目錄棧與隊列棧用于匹配的問題隊列用于堆二叉樹系列深度遍歷&#xff0c;遞歸與迭代層序遍歷二叉樹屬性二叉樹修改與構造二叉搜索樹公共祖先二叉搜索樹的修改與構造棧與隊列 棧用于匹配的問題 20. 有效的括號 https://leetcode-cn.com/problems/valid-parentheses/ 不匹配的三…