我正在编写一些处理密码 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/