如何在C++中访问有关内存的元数据
How to access metadata about memory in C++
我有一个工作流,它有多个通过数据边连接的计算任务;使得一个任务正在为另一个任务产生数据。每个任务都绑定到一个单独的线程。其中一个任务是从内存池中获取内存,该内存由释放该内存的另一个任务回收。
CCD_ 1在存储器池内用于存储诸如存储器起源于何处(GPU地址空间/CPU地址空间)和释放规则(指示何时可以回收存储器)之类的信息。
任务1从池中获取内存:
std::shared_ptr<MemoryData<Type>> m = memGet<Type>("MemoryManagerName", ruleForReleasingMemory);
// Store the memory to passed along with data
data->setMemory(m);
m
必须在数据中从一个任务传递到另一个任务,直到它到达释放它的任务
任务2释放内存:
std::shared_ptr<MemoryData<Type>> m = data->getMemory();
memRelease("MemoryManagerName", m);
我想做的是将memGet
的返回类型更改为仅返回Type
。然后在发布过程中,它可以使用一些方法来获得MemoryData
来回收内存。这将允许我简化Data
表示,这样我就不必存储std::shared_ptr<MemoryData<Type>>
。
到目前为止,我已经考虑了两种设计:
(1) 使用指针算术来使用指向指针**
的指针并由此计算MemoryData
的起始地址。
(2) 在指向Type的指针和指向MemoryData的指针之间创建一个映射,这将需要将这些信息发送到每个任务,如果我必须添加动态内存分配,那么这将有点挑战
(默认情况下)没有关于内存的元数据(如果有,则是特定于实现的)。
您可以编写自己的内存分配器(在现有操作系统基元之上,如Linux上的mmap(2),MemoryData
0也使用这些基元),并自己管理元数据。
你可以在内存地址上玩一些把戏(例如,比特和右移,作为一些uintptr_t
广播,等等)来获得当前的竞技场或内存块。我想的是,如果你有一些任意void* p
指针指向分配器提供的内存区域内的某个东西,你可能会使用(uintptr_t)p >> 14
来获得一些较小的索引到你的元数据中,等等。
当然,这种地址位处理是特定于处理器和操作系统的(这取决于页面大小以及操作系统如何处理它们)。
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 以非特权用户身份查询 NTFS 特殊文件的元数据?
- 如何使用 Google Test 向测试添加元数据 / 如何将数据从 Google Test 发送到 TestEven
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- 从模板创建通用打印函数,以打印基元数据类型变量的值
- 在 C++ 中修改 Grpc 双向流式处理期间的元数据
- cpp / c ++中的grpc客户端代码,元数据x-api-key/x-goog-api-key不起作用,给了我语音A
- 如何使用gRPC在客户端和服务器之间双向发送和接收流元数据
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 如何处理错误"E1696命令行错误:无法在Visual Studio 2017中打开元数据文件"mscorlib.dll"?
- 元数据操作失败LNK2022错误 (8013118D):重复类型中的布局信息不一致 (选择设备参数):(0x020002
- C++11 标准中的哪一部分规定了基元数据类型大小之间的相对顺序?
- 使用 ffmpeg 添加元数据信息
- WIC - Exif 元数据查询 - 如何获取图像说明
- 从Qt应用程序读取元数据
- 如何将编译时元数据/行为添加到特定函数
- 如何在C++中访问有关内存的元数据
- 是否有自定义内存分配器设计模式不在其分配中存储元数据
- 动态内存分配和内存块元数据
- 计算存储缓存元数据所需的缓存内存