自定义内存管理器

2024-04-05

我正在尝试实现一个自定义内存管理器,我想知道是否有更好的方法来实现这个函数,因为当我被问及 void 指针算术时,有几个人认为如果我在 C++ 中有一个 void* ,那就太糟糕了错误的。

// allocates a page of memory.
void ObjectAllocator::allocatePage()
{    
    //if(OAStats_.PagesInUse_ >= Config_.MaxPages_)
        //throw exception

    void* buffer = ::operator new(OAStats_.PageSize_); // allocate memory, no constructor call.

    // =============== Setup the PageList_ ===============
    GenericObject* pNewNode = ::new(buffer) GenericObject();    // Construct GenericObject for the pagelist.
    pNewNode->Next = PageList_->Next;                            // pNewNode points to wherever PageList_ pointed to.
    PageList_->Next = pNewNode;                                    // PageList_ points to pNewNode
    pNewNode = NULL;                                            // dont need this handle anymore
    buffer = static_cast<char*>(buffer) + sizeof(GenericObject);    // move pointer to point after the generic object.

    // =============== Setup the FreeList_ ===============
    for(int i=0;i<Config_.ObjectsPerPage_;++i)
    {
        static GenericObject* pPreviousNode = NULL;            // static variable to hold the previous node
        pNewNode = ::new(buffer) GenericObject();            // Construct GenericObject for the freelist.
        pNewNode->Next = pPreviousNode;
        pPreviousNode = pNewNode;
        buffer = static_cast<char*>(buffer) + OAStats_.ObjectSize_;    // move pointer by ObjectSize.
        ++OAStats_.FreeObjects_;
    }
    FreeList_->Next = pNewNode;

    ++OAStats_.PagesInUse_;
    ++OAStats_.Allocations_;
}

如果您需要一块内存来存储字符串(8 位 ANSI),则将指向该缓冲区的指针声明为 char 并对其进行操作是有意义的。

在您的情况下,您需要一个“blob”内存块,它没有固有类型,因此您正确选择了 void* 来表示该 blob。

现在您需要将该指针增加某个对象的大小。由于显而易见的原因,您无法对 void 指针执行算术运算,那么您该怎么办?投射它。这并没有什么可耻的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义内存管理器 的相关文章

随机推荐

  • 谁负责下一个视图?

    在典型的 MVC 架构中 决定接下来显示哪个视图的逻辑在哪里 假设是某种具有多个视图 窗口 的应用程序 这些视图在不同时间可能可见或不可见 具体取决于用户操作 例如 有时应用程序可能需要用户填写包含其他详细信息的表单 有时则可能不需要 控制
  • 将 Types.NVARCHAR 与 Oracle JDBC 驱动程序结合使用来处理西里尔字符

    我正在尝试使用 JDK 1 6 中国家字符集类型数据的新方法 http download oracle com docs cd B28359 01 java 111 b31224 global htm BABJFAGA 得到一个标准的JDB
  • Flutter:获取视频第一帧

    Flutter项目中如何获取本地视频文件的第一帧 这是我的代码 ImagePicker pickVideo source ImageSource camera then File file if file null mounted I go
  • 如何使用 Visual Studio 代码在 ASP.NET Core 中添加 ASP.NET 身份

    这是我在 ASP NET Core 中的第一个项目 现在我需要在 Visual Studio 代码中为核心 MVC 应用程序实现 ASP NET 身份 我查了一下 但在 Microsoft 网站上找不到任何博客和文档来说明如何做到这一点 如
  • 如何安装imap客户端

    我正在尝试使用 IMAP 客户端库 https imapclient readthedocs org en stable https imapclient readthedocs org en stable 我下载了zip https py
  • `viewDidLayoutSubviews` 中的框架计算

    首先 我应该提到 这主要是一个效率问题 关于在哪里进行框架计算有很多讨论viewWillAppear太早了并且viewDidAppear太晚了 视图已经可见 常见的答案是进行帧计算viewDidLayoutSubviews 问题是 它被多次
  • Silverlight:如何禁用浏览器的刷新按钮?

    我正在开发一个 Silverlight 应用程序 即根本没有 HTML 内容 最大的抱怨之一是如果用户不小心按了 F5 应用程序就会重新启动 那么有什么办法可以禁用浏览器中的 刷新 按钮吗 或者至少处理F5 这里有几个选项 http for
  • Twitter 客户端中的自动链接@提及

    我正在构建一个基本的 Twitter 客户端应用程序 我正在尝试弄清楚如何使保存推文的 TextView 自动链接 提及 以便它们链接到任何人的 Twitter 页面 就像在 Twitter 网站上一样 我的猜测是 这将涉及制作一个自定义
  • 使用 Python evdev 模拟按住控制器 dpad 按钮

    我正在尝试使用 Python evdev 模拟按住控制器上的 DPad 按钮 到目前为止 我已经成功按下一个按钮 如下所示 import os import time from evdev import uinput ecodes as e
  • Active Records 按 ID 排序[重复]

    这个问题在这里已经有答案了 如果我有 id 为 1 2 3 4 的记录 并且想要以某种方式对它们进行排序 例如 1 4 2 3 我该怎么做 我想类似的东西 但它当然行不通 Service all order id 1 4 2 3 贾斯汀 韦
  • JVM 在 OutOfMemoryError 之后是否自行终止 [重复]

    这个问题在这里已经有答案了 发生 OutOfMemoryError 后 JVM 会自行终止吗 如果不是那么为什么 它会尝试收回资源吗 还是有其他原因 OutOfMemoryError 不会终止 JVM 如果它未被捕获 它将终止引发错误的线程
  • angularjs 获取表单操作并提交给它

    我有一个表单 我想捕获它的提交 检查数据的验证 然后将表单提交到 HTML 表单内的操作 div div
  • Jquery 验证自定义错误消息位置

    这看起来很简单 但我无法弄清楚 我正在使用 jquery 验证插件 我正在尝试验证
  • 从点列表中获取两个最近的点

    我得到了一个整数 浮点数列表 我需要找到最接近的两个数字 我将如何仅使用嵌套 for 循环来做到这一点 如果点是一维的 就像您的输入只是一个数字列表 例如 1 4 6 2 那么你可以通过对它们进行排序并找到差异最小的在 O n log n
  • Reactjs - redux 表单和材质 UI 框架 - 具有自动类型 - 和清除字段功能

    我正在构建一个使用 redux 表单和材料 ui 框架的嵌套表单框架 迄今为止我已经在这里构建了组件 https codesandbox io s heuristic hopper lzekw https codesandbox io s
  • 在 GWT 中使数据网格的行可拖动

    我想制作一个数据网格 其中的行可以拖动 以便人们可以通过拖动行来上下移动行 由于数据网格的行将作为元素获取 我知道如何使小部件可拖动 但是如何使数据网格的行可拖动 我不想使用任何额外的插件或库来实现此目的 我所知道的唯一支持单元格小部件拖放
  • 如何配置 Hibernate 以立即应用所有保存、更新和删除?

    我该如何配置休眠 http www hibernate org 在会话执行每个操作后立即将所有保存 更新和删除应用到数据库服务器 默认情况下 Hibernate 将所有保存 更新和删除操作排入队列 并仅在经过一段时间后才将它们提交到数据库服
  • Scala:列表 [Tuple3] 到映射 [字符串,字符串]

    我得到的查询结果为List Int String Double 我需要将其转换为Map String String 用于在 html 选择列表中显示 我的破解方案是 val prices dao getPricing flatMap cas
  • 使用 Redux Observable 等待操作序列

    我有一个用例 在使用 Redux Observables 调度另一个操作之前 我需要等待一系列操作 我见过一些类似的问题 但我无法理解如何在给定的用例中使用这些方法 本质上我想做这样的事情 action ofType PAGINATION
  • 自定义内存管理器

    我正在尝试实现一个自定义内存管理器 我想知道是否有更好的方法来实现这个函数 因为当我被问及 void 指针算术时 有几个人认为如果我在 C 中有一个 void 那就太糟糕了错误的 allocates a page of memory voi