New 与 Malloc,当重载 New 时

2024-01-08

我超载了new and delete实现我自己的小对象/线程安全分配器。

问题是当我超载时new,我不能使用new不破坏普遍因果关系或至少不破坏编译器。我发现的大多数例子都在哪里new超载,使用Malloc()进行实际分配。但根据我对 C++ 的理解,没有任何用例Malloc() at all.

有多个与此类似的答案,其中一些在 SO 之外的侵权行为较少:在什么情况下使用 malloc 和 new? https://stackoverflow.com/questions/184537/in-what-cases-do-i-use-malloc-vs-new

我的问题是,重载运算符时如何分配实际内存new不使用Malloc() ?

(这更多的是出于好奇,尽量不要太认真地对待超载背后的原因;我有一个单独的问题!)


简短的回答:如果你不想要现有的malloc,你需要实现你自己的堆管理器.

例如,堆管理器malloc在Linux的glibc中,HeapAlloc在Windows中,是一种用户级算法。首先,请记住,堆针对分配小尺寸对象(例如 4~512 字节)进行了优化。

如何实现自己的堆管理器?至少,您必须调用系统 API 在进程中分配内存块。有VirtualAlloc对于 Windows 和sbrk对于Linux。这些API分配大块内存,但大小必须是以下的倍数page尺寸。通常,x86 和 Windows/Linux 中的页面大小为 4KB。

获得一块页面后,您需要实现自己的算法,如何将大内存切成更小的请求。一个经典的(仍然非常实用)的实现和算法是dlmalloc: http://g.oswego.edu/dl/html/malloc.html http://g.oswego.edu/dl/html/malloc.html

为了实现,您需要有多个用于记账的数据结构和多个用于优化的策略。例如,对于 16、20、36、256 字节等小对象,堆管理器维护每个大小的块的列表。所以,有一个列表的列表。如果请求的大小大于页面大小,那么它只是调用VirtualAlloc or sbrk。然而,有效的实施非常具有挑战性。您不仅必须考虑速度和空间开销,还必须考虑缓存局部性和碎片。

如果您对针对多线程环境优化的堆管理器感兴趣,请查看tcmalloc: http://goog-perftools.sourceforge.net/doc/tcmalloc.html http://goog-perftools.sourceforge.net/doc/tcmalloc.html

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

New 与 Malloc,当重载 New 时 的相关文章

  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • Jenkinsfile 参数化构建中的环境和参数之间有什么关系?

    最近 我在与同事一起进行 Jenkins 构建时遇到了一些难题 他一直在使用params VARIABLE and env VARIABLE可以互换并且没有任何问题 与此同时 我开始在他通过这行代码的环境对参数对象的调用之一中收到空对象错误
  • 通过在 Javascript 中单击外部来关闭下拉菜单(教程说明)

    我尝试通过以下方式使用 Javascript 实现打开和关闭下拉菜单的方法this https www w3schools com howto howto js dropdown aspw3schools com 上的教程 虽然 显示 下拉
  • PHP - 一小时后检查 json 值

    我创建了一个函数 它使用 json 获取 Twitter 计数 但是 我想在一段时间后 例如一个小时 再次检查一次 但目前它每次加载页面时都会进行检查 以及这会影响页面加载时间 已经有一个 PHP 函数可以完全满足我的要求 但我不记得它了
  • HTTP GET 请求、ASP - 我迷路了!

    将 VBScript 与 ASP 结合使用 我尝试设置一个 HTTP GET 请求 该请求将访问一个页面 该页面又生成一行 ASCII 非 HTML 然后 我想将 ASCII 行 包含由分号分隔的 4 个值 推断回原始 ASP 页面中的 4
  • 如何在 POST 请求后返回重定向到 Django 中的上一页

    我正在编写一个新闻网站 在详细新闻页面中 有一个评论喷泉 如果人们想发表评论 他们需要先登录 我想让他们登录成功后 页面可以返回到上一个新闻页面 这是我的观点 py def newsDetailView request news pk ne
  • Rails 3 库只有在需要时才加载

    我正在尝试在 Rails 3 中加载 Tokbox SDK 我已将该库放置在 lib 目录中 因此目前我的目录结构如下所示 libopentok rb OpenTok异常 rbOpenTokSDK rb会话 rb 我使用 applicati
  • 如何将所有 C# 8 可空引用警告视为错误?

    使用 Visual Studio 2019 v16 3 2 将 NET Core 3 0 项目设置为 C 8 并启用可为 null 的引用类型
  • 如何在 Xcode 中创建具有多列的 UI TableView?

    我正在使用 Xcode 开发 iOS 8 应用程序 我需要在一个视图中显示一张包含多列和多行数据的表 Example Name Time In Time Out ETA Johnnys Supplies 8 30AM 9 00AM 10 1
  • 从pdf文档中提取图像

    我知道以前也有人问过类似的问题 但是它们已经过时了 有些可以追溯到 2006 年 我有一个 net 3 5 应用程序 带有 iTextSharp 5 我正在转换为 net core iText 7 它从 FedEx 跟踪文档中提取签名 并通
  • 从另一个类文件访问 C# 表单文本框

    我想从另一个类文件 例如chartscopier cs 访问Form1元素 但我无法从chartscopier cs更改textbox1文本 我怎样才能做到这一点 这是我的代码 Form1 cs namespace TEST public
  • 插入带有标识列的 Oracle 表时如何使用 %ROWTYPE?

    我有一个 Oracle 12c 数据库 其中有一个包含标识列的表 CREATE TABLE foo id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY bar NUMBER 现在我想使用 P
  • Android:应用程序小部件配置活动的行为与活动不同(编辑自:Android:AppWidget 未嵌入主屏幕)

    在这里编辑 下面是原始帖子 我已将原来的问题缩小为 对于常规活动和应用程序小部件配置活动 主页键的行为根本不同 我用以下最小活动进行了测试 public class TestActivity extends Activity Logger
  • 如何在 Android 中为 ExoPlayer 设计自定义搜索栏和音量控制

    我努力了this https stackoverflow com questions 24772985 how can i design the custom seekbar in android and this http www and
  • 使用ImageMagick/ZBar读取二维码

    我有扫描的图像文件 我对其进行了一些预处理 并使它们看起来像这样 我手机的 ZBar 应用程序可以很好地读取此二维码 但是zbarimg似乎想不通 我在 ImageMagick 中尝试了各种方法以使其更流畅 smooth morpholog
  • 使用 OpenSSL 库在 C++ 中生成 SHA-3 哈希值

    我广泛搜索了使用 OpenSSL 最近实现的 SHA 3 算法进行散列的代码示例 但没有找到任何代码示例 有关于 SHA 1 和 SHA 3 的代码示例 但在库文件夹中快速搜索发现 OpenSSL v1 1 1 中甚至没有 SHA3 函数名
  • 另一台计算机上的目录 - 登录凭据

    我的应用程序需要访问远程计算机上的文件 需要用户名和密码才能访问它 我试图找出目录是否存在 使用 Directory Exists 来验证我可以建立 连接 使用远程目录时有没有办法提供用户名和密码 当前存在返回 false Cheers 不
  • 如何使用维基百科的 Web API 检索某人的传记信息?

    我正在努力通过维基百科的 Web API 从该人的维基百科页面检索该人的一些特定生物详细信息 我需要检索一个人的生物信息框 我找到了如何检索内容框 介绍段落等 下面的 URL 用于检索 wiki 网页的第一个介绍段落 https en wi
  • 在 super.init 之前的表达式中使用初始化属性时出现 Swift 错误

    这并不重要 并且有解决方法 但它令人困惑 请参阅下面的最小示例 我指的是一个已初始化的属性 但在调用 super init 之前 为什么下面所示的语句会出现编译错误 在表达式的右手中使用属性与在左手中使用属性有什么特别之处吗 我浏览了 Sw
  • 在 Webfaction 上设置 Redis

    设置需要哪些步骤Redis http redis io 数据库上网派 http www webfaction com affiliate xeli共享托管帐户 介绍 由于 Webfaction 服务器的特殊环境限制 安装说明并不那么简单 尽
  • New 与 Malloc,当重载 New 时

    我超载了new and delete实现我自己的小对象 线程安全分配器 问题是当我超载时new 我不能使用new不破坏普遍因果关系或至少不破坏编译器 我发现的大多数例子都在哪里new超载 使用Malloc 进行实际分配 但根据我对 C 的理