问题标签 [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.

0 投票
4 回答
3924 浏览

c++ - SSE 和 C++ 容器

以下代码段错误是否有明显的原因?

谢谢

编辑:我在 linux/i686 上使用 g++ 4.5.0,我可能不知道我在这里做什么,但因为即使是以下段错误

我真的认为这一定是和对齐问题。

0 投票
2 回答
5084 浏览

c++ - 用于 STL 的 TCMalloc 分配器

我想将 TCMalloc 与 STL 容器一起使用,因此我需要一个使用 TCMalloc 构建的分配器(例如带有 TBB malloc 的 tbb_allocator)。我找不到任何TCMalloc 文档(如果它被称为文档)。所以我开始探索头文件并找到一个名为STL_Allocator. 但是我不清楚。来自 stl_allocator.h 的报价:

而 STL_Allocator 模板类的定义是:

我不知道那个Alloc论点可能是什么。我应该为一些内存分配函数编写一个包装类吗?有人用过 TCMalloc 吗?

0 投票
2 回答
1274 浏览

c++ - 需要为 c++ std::vector 编写共享内存分配器

请帮助为 std::vector<nIcon*> 类编写 c++ 分配器。

我找到的所有示例都显示了我需要覆盖的方法,而不是代码示例。

我需要在 Windows 上使用共享内存实现分配器(使用 CreateFileMapping 和 MapViewOfFile)

0 投票
5 回答
1646 浏览

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 机器会遇到同样的问题吗?
0 投票
3 回答
407 浏览

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),是否有任何保证:

  1. 提供的静态转换能力A<T>::pointer是一个可访问的基础?A<U>::pointerUT
  2. 提供静态强制转换的能力A<T>::pointer是可访问的基础,并且被继承人的“运行时类型”(无论这在此上下文中意味着什么)是?A<U>::pointerTUU
  3. 类型A<void>::pointer(如果这有意义的话)?

或者有没有我没有想到的问题的解决方案?

0 投票
2 回答
188 浏览

c++ - 使用分配器

这些版本的newdelete是否异常安全?有什么可能的陷阱吗?

假设customized_allocator_type与STL 兼容。还假设分配器的构造函数没有任何副作用并且所有实例都是等价的。

提前感谢您的意见!

0 投票
2 回答
374 浏览

c++ - 具有通用指针类型的自链接类的类设计


我目前正在修改一个复杂的类,它的节点指向自己,就像链表或图一样。我希望它使用boost::interprocess函数在共享内存中使用。现在我正在寻找重新设计它的方法,以使其保持通用并涉及最少的更改。

重新设计应该使用boost::interprocess::allocator分配器,以便隐式使用boost::interprocess::offset_ptr类型的相对智能指针。我认为它应该涉及第二个模板参数,例如

由于循环依赖,这当然不起作用,就像引用一样。
我希望可以从 C++ 类模板专业人士那里得到一些帮助,了解实现它的最佳方式。我查看了启用了 boost 共享内存的容器,但他们正在以一种涉及多个外部类的相当复杂的方式解决它。

约翰

0 投票
2 回答
14684 浏览

c++ - C++ STL 分配器与运算符 new

根据 C++ Primer 4th edition, page 755,有一条注释说:

现代 C++ 程序通常应该使用分配器类来分配内存。它更安全、更灵活。

我不太明白这个说法。到目前为止,我阅读的所有材料都教使用newC++ 分配内存。书中展示了向量类如何利用分配器的示例。但是,我想不出其他场景。

任何人都可以帮助澄清这一说法吗?并给我更多的例子?我应该何时使用分配器以及何时使用new?谢谢!

0 投票
4 回答
277 浏览

c++ - 在 std::allocator rebind 上转移对象所有权

我有一个 Visual Studio 2008 C++ 应用程序,我正在实现一个替换容器中使用的标准分配器,如std::vector. 但是,我遇到了一个问题。我的实现依赖于拥有资源句柄的分配器。在使用该功能的情况下rebind,我需要将句柄的所有权转移给新的分配器。像这样的东西:

不幸的是,我无法解除句柄所有权的旧分配器,因为它是const. 如果我const从重新绑定构造函数中删除,那么容器将不会接受它。

有没有解决这个问题的好方法?

0 投票
6 回答
364 浏览

c++ - 改进分配器算法实现的建议

我有一个 Visual Studio 2008 C++ 应用程序,我在其中使用标准容器的自定义分配器,以便它们的内存来自内存映射文件而不是堆。此分配器用于 4 个不同的用例:

  1. 104字节固定大小结构std::vector< SomeType, MyAllocator< SomeType > > foo;
  2. 200字节固定大小结构
  3. 304字节固定大小结构
  4. 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 没有足够的空间,则有一个。

分配器使用的算法如下:

  1. 对于每个超级块:超级块的末端是否有空间?把分配放在那里。(快速地)
  2. 如果没有,则在每个 SuperBlock 中搜索足够大小的空白空间并将分配放在那里。(减缓)
  3. 依然没有?分配另一个 SuperBlock 并将分配放在新 SuperBlock 的开头。

不幸的是,第 2 步可能会在一段时间后变得非常缓慢。随着对象的复制和临时变量的销毁,我得到了很多碎片。这会导致在内存结构中进行大量深度搜索。碎片化存在问题,因为我可以使用的内存有限(请参阅下面的注释)

任何人都可以建议改进这个算法来加快这个过程吗?我是否需要两种单独的算法(一种用于固定大小的分配,一种用于字符串分配器)?

注意:对于那些需要理由的人:我在 Windows Mobile 中使用此算法,其中堆有 32MB 的进程槽限制。所以,通常std::allocator不会削减它。我需要将分配放在 1GB 大内存区域中以获得足够的空间,这就是这样做的。