问题标签 [allocator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - SSE 和 C++ 容器
以下代码段错误是否有明显的原因?
谢谢
编辑:我在 linux/i686 上使用 g++ 4.5.0,我可能不知道我在这里做什么,但因为即使是以下段错误
我真的认为这一定是和对齐问题。
c++ - 用于 STL 的 TCMalloc 分配器
我想将 TCMalloc 与 STL 容器一起使用,因此我需要一个使用 TCMalloc 构建的分配器(例如带有 TBB malloc 的 tbb_allocator)。我找不到任何TCMalloc 文档(如果它被称为文档)。所以我开始探索头文件并找到一个名为STL_Allocator
. 但是我不清楚。来自 stl_allocator.h 的报价:
而 STL_Allocator 模板类的定义是:
我不知道那个Alloc
论点可能是什么。我应该为一些内存分配函数编写一个包装类吗?有人用过 TCMalloc 吗?
c++ - 需要为 c++ std::vector 编写共享内存分配器
请帮助为 std::vector<nIcon*> 类编写 c++ 分配器。
我找到的所有示例都显示了我需要覆盖的方法,而不是代码示例。
我需要在 Windows 上使用共享内存实现分配器(使用 CreateFileMapping 和 MapViewOfFile)
c++ - 为什么删除的内存无法重用
我在带有 MSVC 9.0 的 Windows 7 上使用 C++,并且还能够在带有 MSVC 9.0 的 Windows XP SP3 上进行测试和重现。
如果我分配 1 GB 的 0.5 MB 大小的对象,当我删除它们时,一切正常并且按预期运行。但是,如果我在删除它们时分配 1 GB 的 0.25 MB 大小的对象,则内存保持保留状态(地址空间监视器中的黄色),从那时起将只能用于小于 0.25 MB 的分配。
这个简单的代码将让您通过更改哪个结构是 typedef'd 来测试这两种情况。在分配并删除结构后,它将分配 1 GB 的 1 MB 字符缓冲区,以查看字符缓冲区是否会使用结构曾经占用的内存。
您可以在下面看到我在Address Space Monitor中的结果。让我强调一下,这两个最终结果之间的唯一区别是分配给 1 GB 标记的结构的大小。
对我来说,这似乎是一个相当严重的问题,许多人可能正在遭受痛苦,甚至不知道。
- 那么这是设计使然还是应该将其视为错误?
- 我可以让较小的已删除对象实际上可以免费供较大的分配使用吗?
- 出于好奇,Mac 或 Linux 机器会遇到同样的问题吗?
c++ - 标准库分配器指针类型的要求
我正在尝试编写一个四叉树稀疏矩阵类。简而言之,aquadtree_matrix<T>
要么是零矩阵,要么是 的四元(ne, nw, se, sw)
组quadtree_matrix<T>
。
我想最终测试不同的分配方案,因为这可能会影响线性代数运算的性能。因此,我还将quadtree_matrix
在标准分配器类型上进行模板化,以便我可以重用现有的分配器。
我将不得不分配两种不同类型的数据: aT
或 a node
,其中包含四个指针(指向 T 或节点)。对于我将考虑的所有算法,我确切地知道期望什么样的数据,因为我知道在算法的任何时候我所面临的子矩阵的大小是多少(我什至不需要存储这些大小)。
我当然会使用两种不同的分配器:这没关系,因为分配器类型提供rebind
模板和模板复制构造函数(并且旨在用作值类型,正如get_allocator
标准容器的成员通过返回副本所建议的那样)。
问题是分配器成员函数使用某种pointer
类型,它不需要是普通指针。一些分配器(增强进程间分配器)广泛使用此功能。
如果分配器指针类型是花园品种指针,我不会有任何问题:至少,我可以使用指向 void 的指针并将它们重新解释为正确的类型(node*
或T*
)。我也可以使用联合(可能更好)。
据我所知,对类型的 POD 没有要求allocator::pointer
。它们只需要是随机访问迭代器。
现在,我的问题是:
给定一个分配器类模板A<T>
(或其等价物A::rebind<T>::other
),是否有任何保证:
- 提供的静态转换能力
A<T>::pointer
是一个可访问的基础?A<U>::pointer
U
T
- 提供静态强制转换的能力
A<T>::pointer
是可访问的基础,并且被继承人的“运行时类型”(无论这在此上下文中意味着什么)是?A<U>::pointer
T
U
U
- 类型
A<void>::pointer
(如果这有意义的话)?
或者有没有我没有想到的问题的解决方案?
c++ - 使用分配器
这些版本的new和delete是否异常安全?有什么可能的陷阱吗?
假设customized_allocator_type与STL 兼容。还假设分配器的构造函数没有任何副作用并且所有实例都是等价的。
提前感谢您的意见!
c++ - 具有通用指针类型的自链接类的类设计
我目前正在修改一个复杂的类,它的节点指向自己,就像链表或图一样。我希望它使用boost::interprocess函数在共享内存中使用。现在我正在寻找重新设计它的方法,以使其保持通用并涉及最少的更改。
重新设计应该使用boost::interprocess::allocator分配器,以便隐式使用boost::interprocess::offset_ptr类型的相对智能指针。我认为它应该涉及第二个模板参数,例如
由于循环依赖,这当然不起作用,就像引用一样。
我希望可以从 C++ 类模板专业人士那里得到一些帮助,了解实现它的最佳方式。我查看了启用了 boost 共享内存的容器,但他们正在以一种涉及多个外部类的相当复杂的方式解决它。
约翰
c++ - C++ STL 分配器与运算符 new
根据 C++ Primer 4th edition, page 755,有一条注释说:
现代 C++ 程序通常应该使用分配器类来分配内存。它更安全、更灵活。
我不太明白这个说法。到目前为止,我阅读的所有材料都教使用new
C++ 分配内存。书中展示了向量类如何利用分配器的示例。但是,我想不出其他场景。
任何人都可以帮助澄清这一说法吗?并给我更多的例子?我应该何时使用分配器以及何时使用new
?谢谢!
c++ - 在 std::allocator rebind 上转移对象所有权
我有一个 Visual Studio 2008 C++ 应用程序,我正在实现一个替换容器中使用的标准分配器,如std::vector
. 但是,我遇到了一个问题。我的实现依赖于拥有资源句柄的分配器。在使用该功能的情况下rebind
,我需要将句柄的所有权转移给新的分配器。像这样的东西:
不幸的是,我无法解除句柄所有权的旧分配器,因为它是const
. 如果我const
从重新绑定构造函数中删除,那么容器将不会接受它。
有没有解决这个问题的好方法?
c++ - 改进分配器算法实现的建议
我有一个 Visual Studio 2008 C++ 应用程序,我在其中使用标准容器的自定义分配器,以便它们的内存来自内存映射文件而不是堆。此分配器用于 4 个不同的用例:
- 104字节固定大小结构
std::vector< SomeType, MyAllocator< SomeType > > foo;
- 200字节固定大小结构
- 304字节固定大小结构
- n 字节字符串
std::basic_string< char, std::char_traits< char >, MyAllocator< char > > strn;
我需要能够为每一个分配大约 32MB 的空间。
std::map
分配器使用指向分配大小的指针来跟踪内存使用情况。typedef std::map< void*, size_t > SuperBlock;
每个 SuperBlock 代表 4MB 内存。
std::vector< SuperBlock >
如果一个 SuperBlock 没有足够的空间,则有一个。
分配器使用的算法如下:
- 对于每个超级块:超级块的末端是否有空间?把分配放在那里。(快速地)
- 如果没有,则在每个 SuperBlock 中搜索足够大小的空白空间并将分配放在那里。(减缓)
- 依然没有?分配另一个 SuperBlock 并将分配放在新 SuperBlock 的开头。
不幸的是,第 2 步可能会在一段时间后变得非常缓慢。随着对象的复制和临时变量的销毁,我得到了很多碎片。这会导致在内存结构中进行大量深度搜索。碎片化存在问题,因为我可以使用的内存有限(请参阅下面的注释)
任何人都可以建议改进这个算法来加快这个过程吗?我是否需要两种单独的算法(一种用于固定大小的分配,一种用于字符串分配器)?
注意:对于那些需要理由的人:我在 Windows Mobile 中使用此算法,其中堆有 32MB 的进程槽限制。所以,通常std::allocator
不会削减它。我需要将分配放在 1GB 大内存区域中以获得足够的空间,这就是这样做的。