c++ - 分配器感知 `std::array` 风格的容器?

标签 c++ c++17 allocator c++20 stdarray

我正在编写一些处理密码 secret 的代码,并且我创建了一个自定义 ZeroedMemory实现std::pmr::memory_resource它处理释放内存时清理内存,并使用您必须使用的魔法进行封装,以防止优化编译器省略该操作。这个想法是为了避免特化 std::array ,因为缺少虚拟析构函数意味着类型删除后的析构将导致内存在未清理的情况下被释放。

不幸的是,后来我才意识到std::array不是 AllocatorAwareContainer .我的std::pmr::polymorphic_allocator方法有点误导,因为显然 std::array 中没有空间。存储指向特定分配器实例的指针。仍然,我无法理解为什么分配器 std::allocator_traits<A>::is_always_equal::value == true不允许,我可以轻松地将我的解决方案重新实现为通用 Allocator而不是更易于使用的 std::pmr::memory_resource ...

现在,我通常可以使用 std::pmr::vector相反,而是 std::array 的一个不错的功能是数组的长度是类型的一部分。例如,如果我正在处理一个 32 字节的 key ,我就不必进行运行时检查来确保 std::array<uint8_t, 32>某人传递给我的函数的参数实际上是正确的长度。事实上,那些很好地归结为 const std::span<uint8_t, 32> ,这大大简化了编写需要与 C 代码互操作的函数,因为它们使我能够基本上免费地处理来自任何来源的任意内存块。

具有讽刺意味的是,std::tuple需要分配器...但我不敢想象处理 32 字节 std::tuple<uint8_t, uint8_t, uint8_t, uint8_t, ...> 所需的 typedef .

所以:是否有任何标准类型可以容纳固定数量的同类项目,la std::array , 但分配器知道(并且最好将项目存储在连续区域中,因此它可以向下转换为 std::span )?

最佳答案

您需要编译器和操作系统的合作才能使这种方案起作用。 P1315是一项解决编译器/语言方面问题的提案。至于操作系统,您必须确保内存从未被分页到磁盘等,以便真正将内存归零。

关于c++ - 分配器感知 `std::array` 风格的容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57487566/

相关文章:

c# - 使用 native C++ 中的通用 Windows C# 类库

c++ - constexpr 对匿名结构变量的引用

c++ - Apple Clang:无法使用自定义分配器编译对 vector 的 std::erase 调用

c++ - 为什么这个 "undefined extern variable"不会导致 C++17 中的链接器错误?

c++ - const 方法中的非常量 lambda 捕获

memory-management - OpenCV 的自定义内存分配器

c++ - 在 C++20 中 std::vector 运算符 == 对具有不同分配器的 vector 不起作用有什么原因吗?

c++ - 'compiling and linking' 和 'compiling'(使用 g++)有什么区别?

c++ - CFX_ImageCR3 |无法在运行 ColdFusion 10 64 位的 Windows Server 2008 R2 64 位上加载库

c++ - 在数组上调用赋值运算符