问题标签 [boost-pool]
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.
boost - 具有指定元素大小和指定初始元素 # 的提升池?
boost::pool<> 构造函数采用“元素大小”参数。
boost::object_pool 构造函数采用“元素的初始#”参数。
我想用“元素大小 S”和“元素的初始 N”创建池。
boost::pool 可以做到这一点吗?
谢谢
c++ - Boost Pool Library:如何重用创建的对象?
所以在我的程序开始时,我想在一些 3 个服装数据元素(例如字符结构和长度)上创建一些缓冲区数组。在所有 3 个元素都被使用之后,我想先从我的应用程序中传递出去,然后再传递第二个元素等。Boost Pool Library是否有可能以及如何做到这一点?
c++ - 在这种情况下,如何决定堆栈、堆和 boost::pool 分配?
我有一个类使用 boost::variant 来存储双精度或字符串,如下所示:
对于我正在玩的玩具解释器,它应该是不可变的值类型。起初,通过 const 引用传递它并按值返回似乎是一个好主意,并始终将它分配在堆栈上,因为我希望它被视为原语。但是,后来我看到它的大小是 40 字节(主要是由于 std::string 的 sizeof),我有点担心。我知道我不应该在堆栈上分配大块内存,但是多大才算太大?
此外,每次返回时复制 40 个字节,特别是因为该值是不可变的,甚至不需要复制,这似乎有点浪费。
常规堆分配选项似乎不太有吸引力,因为我每秒可以有数千个这样的分配/解除分配。
我想出的最后一个选择是在需要时使用 boost::pool 来分配这些对象,并使用 boost::shared_ptr 来管理它们的生命周期。然而,因为解释器负责内存分配(内存分配的类型将是作为模板参数传递给解释器的策略),这意味着值类必须知道解释器,这会使事情稍微复杂化.
所以这些是问题:
- 在这种情况下我应该怎么做,为什么?
- 在堆栈上分配“太大”有多大?我敢肯定,这取决于分配的频率以及必须复制的频率。
谢谢。
boost - 提升池替代 calloc
全部,
如果您使用 boost pool 库,您将如何替换以下语句:
如果是针对一个元素,我会这样做:
但由于“numOfElements”是一个变量,我觉得执行 malloc() 循环不是一个好主意?
c++ - Boost::Pool 未链接
我正在使用boost::pool
. 它只有头文件,没有 dll 或 o 或 lib 文件。它应该在没有它们的情况下工作。
当我编译我的代码时,它说:
为什么是这样?应该没有 .lib 导致问题。
c++ - boost::object_pool 构造函数参数数量
我正在使用来自 boost pool 库的 boost::object_pool 接口。默认情况下 boost::object_pool::construct 最多可以使用三个参数。我需要传递 13 个参数来构造其中一个对象。我按照此处的建议在文件detail/pool_construct.m4中将 m4 宏 NumberOfArguments(可以传递给 boost::object_pool::construct 的最大参数)定义为 13 。最后文件看起来像
现在我收到错误消息,例如
有趣的是,即使恢复 detail/pool_construct.m4 中的更改也没有修复它,现在即使使用原始文件,我也无法将任意数量的参数传递给 boost::object_pool::construct。我正在使用 Visual C++ 2010 express。任何帮助将不胜感激。
谢谢
c++ - boost::singleton_pool 中的对象创建
我正在尝试使用boost::singleton_pool在高性能关键多线程应用程序中创建大量“订单”类型的对象。查看文档,这是我应该做的,
boost::singleton_pool 有一个静态成员函数 malloc,它返回 void* 的指针,但我需要通过调用其构造函数在 OrderPool 中创建 Order 类型的对象。我应该使用boost::pool_allocator和 singleton_pool 来这样做吗?
谢谢。
c++ - 使用 boost singleton_pool 的自定义分配比默认值慢
我为 MyOrder 类编写了自定义运算符 new 和 operator delete。我正在使用 boost::singleton 池分配内存。这是测试性能的程序,
我使用 -O2 标志编译了上述程序,并在我的 Macbook 上运行 2.26 GHz Intel Core 2 Duo,耗时 0.16 秒。然后我注释掉我声明和定义自定义运算符 new 和 operator delete 的行,使用 -O2 标志重新编译并在同一台机器上运行,耗时 0.13 秒。
使用 singleton_pool 为相同大小的对象分配和释放内存应该会加快速度。为什么让它变慢?还是创建池的开销抵消了在这个小程序中获得的性能优势?
更新:
我用一个 int 和一个 double 替换了两个 std::string 变量,这次在 3.0 GHZ AMD Phenom(tm) II X4 945 处理器上运行了两个程序,每个程序进行了 100000000 次(即之前的 1000 次)迭代。使用自定义内存分配的一项需要 3.2 秒,而使用默认内存分配的一项需要 8.26 秒。所以这次自定义内存分配获胜。
c++ - 在使用 boost::singleton_pool 时处理 std::string/std::vector 成员变量
我正在编写一个性能关键的应用程序,在该应用程序中我创建了大量类似类型的对象来下订单。我正在使用boost::singleton_pool来分配内存。最后我的课看起来像这样。
我最近发布了一个关于使用 boost::singleton_pool 的性能优势的问题。当我比较boost::singleton_pool和默认分配器的性能时,我没有获得任何性能优势。当有人指出我的班级有 std::string 类型的成员,其分配不受我的自定义分配器控制时,我删除了 std::string 变量并重新运行测试。这一次,我注意到性能有了相当大的提升。
现在,在我的实际应用中,我无法摆脱时间 std::string 和 std::vector 的成员变量。我应该将boost::pool_allocator与我的 std::string 和 std::vector 成员变量一起使用吗?
boost::pool_allocator 从底层 std::singleton_pool 分配内存。不同的成员变量是否重要(我的 MyOrder 类中有多个 std::string/std::vector 类型。此外,我正在为 MyOrder 以外的包含 std::string/std::vector 类型的类使用池作为成员)使用相同的内存池?如果是这样,我如何确保他们以一种或另一种方式做事?
memory-pool - 可变大小缓冲区的内存池使用情况(boost :: pool)?
我当前项目的瓶颈是堆分配......分析表明一个关键线程在new
操作员中花费的时间大约为 50%。
应用程序不能在这里使用堆栈内存,需要分配大量的一个中央作业结构——自定义作业/缓冲区实现:小而短,但大小可变。该对象本身就是堆内存std::shared_ptr
/std::weak_ptr
对象,并带有经典的 C-Array ( char*
) 有效负载。
根据不同部分的运行时配置和工作负载,可能会创建 300k-500k 对象并同时使用(但这通常不会发生)。由于它的 x64 应用程序内存碎片并不是什么大问题(但当它也针对 x86 时可能会出现)。
为了提高速度和数据包吞吐量,并在未来节省内存碎片,我正在考虑使用一些内存管理池,这导致我使用boost::pool
.
几乎所有示例都使用固定大小的对象......但我不确定如何处理可变长度的有效负载?可以使用 boost::pool 创建像这样的简化对象,但我不确定如何处理有效负载?它完全可以使用
/li>boost:pool
吗?通常,当对 shared_ptr 的所有引用都超出范围时,对象会被销毁,我不想将 shared-ptr 更改回 c-ptr。对象的延迟销毁也应该可以提高性能,并且从我读到的内容应该可以更好地使用 boost:pool。我还没有发现池是否支持与 smart_ptr 的交互?另一种但古怪的方法是在创建时将对 shared_ptr 的引用与池一起保存并以块的形式释放它们。
有没有人有这两者的经验?boost:pool 使用可变大小的对象和智能指针交互?
谢谢!