映射和设置总是一次分配一个项目吗
Do map and set allocate 1 item at a time always?
我正在C++14中实现std::map
和std::set
的分配器。分配器必须提供一个函数pointer allocate(size_type n)
,该函数一次为n
项分配空间。
经过一些测试,我看到std::map
和std::set
在我的平台上总是做allocate(1)
,我没有看到任何n > 1
。如果我考虑一下内部的树表示,这对我来说是有意义的。
标准能保证这种行为吗?或者,我可以放心地在任何特定平台中始终信任n == 1
吗?
标准是否保证这种行为
没有。该标准不能保证这一点。
或者我可以在任何特定平台中始终安全地信任n=1吗
指令插入时的分配数量受到容器方法复杂性的限制。例如,对于std::map::insert
,标准指定(从cppreference,只有前3个重载,插入单个元素):
1-3)容器大小的对数,O(log(size()))。
然后实现者可以自由选择满足此规范的实现。log(size())
部分是因为你需要找到插入的地方,为固定数量的元素分配空间只是对复杂性的一个持续贡献。实现可以选择在每次调用时为两个元素分配空间。2和1一样恒定。然而,在绝对值上,不难找到分配1比分配2更有效的情况。此外,std::map
和std::set
不需要将它们的元素存储在连续存储器中。
因此,我假设它总是1,但你不能保证。如果你想确定,你必须看看具体的实现,但你依赖于实现的细节。
CCD_ 14与CCD_
A::allocate(n)
必须返回一个指针,因此分配非连续内存并非易事。然而,不要求该指针是T*
。相反,CCD_ 18返回一个CCD_。这可以是任何类型,只要它满足NullablePointer
、LegacyRandomAccessIterator
和LegacyContiguousIterator
即可。
cppreference提到boost::interprocess::offset_ptr作为如何分配分段内存的示例。你可能想看看。以下是完整报价:
花式指针
当成员类型指针不是原始指针类型时,通常被称为"花式指针"。这样的指针被引入支持分段内存体系结构,目前用于访问在不同于同构的地址空间中分配的对象由原始指针访问的虚拟地址空间。示例花式指针是与映射地址无关的指针boost::interprocess::offset_ptr,这使分配成为可能基于节点的数据结构,如共享内存中的std::set和在每个进程中映射到不同地址的内存映射文件。花式指针可以独立于分配器使用通过类模板std::pointer_traits提供了它们。
- 将数组的地址分配给变量并删除
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- vector.resize()中的分配错误
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 欧拉项目#8答案是大以获得有效答案
- 在 QStandardItemModel 中解除分配项目
- 映射和设置总是一次分配一个项目吗
- 特征:沿着一个维度复制项目,而无用分配
- std :: vector :: erase(item)需要为项目定义的分配操作员
- 分配具有不同数量和大小的项目的特定大小数组
- 在UWP C++项目中,程序集分配的内存指针自动更改为0xffffffff
- waf:如何使用额外的工具以及如何分配项目
- 我是否必须在Xcode iOS项目中释放C的内存分配
- 我的项目分配不好
- vc++ 10项目为对象分配了太多内存
- 用std::矢量迭代器分配std::字符串在一个项目中会导致调试错误,但在另一个项目却能正常工作