- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我开始在项目中使用一些自定义内存分配器,例如rpmalloc和ltmalloc,但我对集成有所担忧,我的项目具有构建为共享库或静态库的各种内部模块(取决于我在构建系统中的配置方式),并且应该为Windows / Linux / FreeBSD / Mac OS X和诸如x86和ARM之类的体系结构构建/运行,而且我不知道是否应该在头文件中调用内存分配器集成,还是应该保留在其中cpp文件。
如果内存分配器调用保留在头文件中,则每个模块都应链接该内存分配器的静态库,如果它保存在.cpp文件中,则调用将包含在包含它们的库中,并且只有该模块才应链接该内存分配器。自定义内存分配器,但是该模块应该包含一个接口(interface),每个模块都可以分配它们(避免内存分配不一致)
如果已正常分配内存(如malloc / free / syscalls一样),则我已阅读here,每个共享库都有自己的堆,但是如果使用mmap,则分配的内存不属于程序堆。
我的问题是,如果将共享/静态库保存在一个库中,是否会对我的共享/静态库造成任何危害(但每个其他库都应将其链接以便访问其内存分配接口(interface))?还是所有内容都应内联在头文件中,并且每个库都应链接内存分配器库?
最佳答案
内存分配的完成方式在很大程度上取决于操作系统。您需要了解共享库在这些操作系统中的工作方式,C语言如何与那些操作系统以及共享库的概念相关。
C,C++和模块化编程
首先,我想提一下C语言不是模块化语言,例如它不支持模块或模块化编程。对于诸如C和C++之类的语言,模块化编程的实现由底层操作系统决定。共享库是用于用C和C++实现模块化编程的机制的示例,因此我将它们称为模块。
模块=共享库和可执行文件
Linux和类Unix系统
最初,Unix系统上的所有内容都是静态链接的。共享库稍后发布。而且,由于Unix是C语言的起点,因此这些系统试图提供与C语言编程相近的共享库编程接口(interface)。
这个想法是,应该在不考虑共享库的情况下构建最初编写的C代码,并且应该在不更改源代码的情况下工作。结果,所提供的环境通常具有由所有加载的模块共享的单个进程范围的符号 namespace ,例如在整个过程中,只有一个名称为foo
的函数,除了static
函数(以及某些使用OS特定机制的模块中的hidden
)除外。基本上与静态链接相同,在静态链接中,不允许使用重复的符号。
这对于您的情况意味着在整个过程中始终使用一个名为malloc
的函数,并且每个模块都在使用它,例如所有模块共享相同的内存分配器。
现在,如果进程碰巧具有多个malloc
函数,则仅选择一个函数并将其用于所有模块。这里的机制非常简单-共享库不知道每个引用函数的位置,因此它们通常会通过一些表(GOT
,PLT
)来调用它们,该表在第一次调用或加载时会懒洋洋地填充所需的地址。提供原始功能的模块采用了相同的规则-即使在同一表中也将在内部调用此功能,即使在提供该功能的原始模块中也可以覆盖该功能(这是许多与效率低下有关的原因在Linux上使用共享库,请搜索-fno-semantic-interposition
,-fno-plt
来克服这一问题)。
这里的一般规则是,引入符号的第一个模块将是提供符号的模块。因此,原始流程可执行文件在此处具有最高优先级,如果它定义了malloc
函数,则该malloc
函数将在流程中的任何地方使用。这同样适用于calloc
,realloc
,free
和其他函数。使用此类技巧和类似LD_PRELOAD
的技巧可让您覆盖应用程序的“默认内存分配器”。由于存在一些极端情况,因此不能保证这能正常工作。在执行此操作之前,您应该查阅图书馆的文档。
我要特别指出,这意味着在所有模块共享的进程中只有一个堆,这是有充分理由的。类似Unix的系统通常提供两种在进程中分配内存的方式:
brk
,sbrk
系统调用mmap
系统调用brk
,
sbrk
,要么应该覆盖C库的现有分配器。
VirtualAlloc
,MapViewOfFile
的功能。 HeapCreate
,HeapAlloc
。 mmap
,而第二个等效于
malloc
的更高级版本,该版本基于
VirtualAlloc
内部(如我所相信)。
malloc
和
free
函数。而是由C运行时库提供的,该库在Windows API之上实现。
malloc
,
free
等的独立实现,每个运行在单独的堆上。
GetProcessHeap
获得),同时它们将共享该进程中C个运行时之一的堆。
ntdll.dll
。对于ELF,可执行文件具有“静态链接”和“动态链接”可执行文件不同的类型。
关于c++ - 跨共享/静态库集成C++自定义内存分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47372194/
好的,所以我编辑了以下... 只需将以下内容放入我的 custom.css #rt-utility .rt-block {CODE HERE} 但是当我尝试改变... 与 #rt-sideslid
在表格 View 中,我有一个自定义单元格(在界面生成器中高度为 500)。在该单元格中,我有一个 Collection View ,我按 (10,10,10,10) 固定到边缘。但是在 tablev
对于我的无能,我很抱歉,但总的来说,我对 Cocoa、Swift 和面向对象编程还很陌生。我的主要来源是《Cocoa Programming for OS X》(第 5 版),以及 Apple 的充满
我正在使用 meta-tegra 为我的 NVIDIA Jetson Nano 构建自定义图像。我需要 PyTorch,但没有它的配方。我在设备上构建了 PyTorch,并将其打包到设备上的轮子中。现
在 jquery 中使用 $.POST 和 $.GET 时,有没有办法将自定义变量添加到 URL 并发送它们?我尝试了以下方法: $.ajax({type:"POST", url:"file.php?
Traefik 已经默认实现了很多中间件,可以满足大部分我们日常的需求,但是在实际工作中,用户仍然还是有自定义中间件的需求,为解决这个问题,官方推出了一个 Traefik Pilot[1] 的功
我想让我的 CustomTextInputLayout 将 Widget.MaterialComponents.TextInputLayout.OutlinedBox 作为默认样式,无需在 XML 中
我在 ~/.emacs 中有以下自定义函数: (defun xi-rgrep (term) (grep-compute-defaults) (interactive "sSearch Te
我有下表: 考虑到每个月的权重,我的目标是在 5 个月内分散 10,000 个单位。与 10,000 相邻的行是我最好的尝试(我在这上面花了几个小时)。黄色是我所追求的。 我试图用来计算的逻辑如下:计
我的表单中有一个字段,它是文件类型。当用户点击保存图标时,我想自然地将文件上传到服务器并将文件名保存在数据库中。我尝试通过回显文件名来测试它,但它似乎不起作用。另外,如何将文件名添加到数据库中?是在模
我有一个 python 脚本来发送电子邮件,它工作得很好,但问题是当我检查我的电子邮件收件箱时。 我希望该用户名是自定义用户名,而不是整个电子邮件地址。 最佳答案 发件人地址应该使用的格式是: You
我想减小 ggcorrplot 中标记的大小,并减少文本和绘图之间的空间。 library(ggcorrplot) data(mtcars) corr <- round(cor(mtcars), 1)
GTK+ noob 问题在这里: 是否可以自定义 GtkFileChooserButton 或 GtkFileChooserDialog 以删除“位置”部分(左侧)和顶部的“位置”输入框? 我实际上要
我正在尝试在主页上使用 ajax 在 magento 中使用 ajax 显示流行的产品列表,我可以为 5 或“N”个产品执行此操作,但我想要的是将分页工具栏与结果集一起添加. 这是我添加的以显示流行产
我正在尝试使用 PasswordResetForm 内置函数。 由于我想要自定义表单字段,因此我编写了自己的表单: class FpasswordForm(PasswordResetForm):
据我了解,新的 Angular 7 提供了拖放功能。我搜索了有关 DnD 的 Tree 组件,但没有找到与树相关的内容。 我在 Stackblitz 上找到的一个工作示例.对比drag'ndrop功能
我必须开发一个自定义选项卡控件并决定使用 WPF/XAML 创建它,因为我无论如何都打算学习它。完成后应该是这样的: 到目前为止,我取得了很好的进展,但还有两个问题: 只有第一个/最后一个标签项应该有
我要定制xtable用于导出到 LaTeX。我知道有些问题是关于 xtable在这里,但我找不到我要找的具体东西。 以下是我的表的外观示例: my.table <- data.frame(Specif
用ejs在这里显示日期 它给我结果 Tue Feb 02 2016 16:02:24 GMT+0530 (IST) 但是我需要表现为 19th January, 2016 如何在ejs中执行此操作?
我想问在 JavaFX 中使用自定义对象制作 ListView 的最佳方法,我想要一个每个项目如下所示的列表: 我搜了一下,发现大部分人都是用细胞工厂的方法来做的。有没有其他办法?例如使用客户 fxm
我是一名优秀的程序员,十分优秀!