草庐IT

延时分配

全部标签

c++ - 内存分配器范围的设计

我一直在阅读关于内存管理的不同文章,为我希望我的架构如何工作做准备,我最担心的是如何在整个代码库中使用、创建和处理分配器。问题之一是我的设计总是在全局范围内具有分配器,因为我没有典型的单例设计来包含分配器,它们没有真正的居住地。由于使用全局变量的所有典型问题,我想避免为此使用全局变量。这让我想到了这样的设计void*operatornew(size_tsize,uint32_ttype){returngAllocator.Alloc(size,type);}这将导致头文件中只有新定义,声明在.cpp中。然后,此.cpp文件将具有gAllocator,仅在.cpp文件中(并且可以在除新调

c++ - Boost 快速池分配器有函数指针问题?

这是Boost错误还是我做错了什么?#include#includeintmain(){typedefconststd::stringkey;typedefdouble*(*value)(constint&);std::map>map_with_standard_allocator;//worksstd::map,boost::fast_pool_allocator>>map_with_boost_allocator;//fails}最后一行无法在带有Boost1.40和1.48的MSVisualStudio2008下编译。不过,它在g++4.5.3(Cygwin)下编译得很好。错误是

c++ - 有哪些符合 C++ 标准的自定义分配器可用?

我想以从std::allocator派生的类的形式使用一些符合C++std的内存管理,但能够分配内存块并释放和释放它们的较小部分。我只找到了boost::pool,但这在上述意义上不符合标准。周围有什么更有用的东西吗?还是我必须自己编写代码?(请注意,std::allocator通常无法分配许多小对象,即在使用std::list时。)编辑以澄清。说,我想使用许多小对象的std::list,然后是std::allocator的实现,它使用::分配每个对象:new会导致运行时的大量开销(我认为还有内存)。分配大块对象并将它们一个一个地分发会更有效率。为此,我需要一个符合std的分配器(不需

c++ - 与 STL vector 对齐分配

我希望我的vector存储对齐(比如16字节边界),所以我将这个分配器作为memalign()的包装器,我想知道这是否是正确的方法分配用于STLvector的对齐内存。templateclassAlignedAllocator{public:...pointerallocate(size_typesize,const_pointer*hint=0){return(pointer)memalign(Alignment,size*sizeof(T));};voiddeallocate(pointerp,size_typesize){free(p);};...}如果没有,是否有适用于STL容

c++ - 如何显式管理异构类型(和大小)的多个池分配器?

场景:我有一个G类,它通常包含成千上万个从N类派生的类型的对象。所有这些对象都有明确定义的生命周期。首先,构造一个对象G,然后添加N个派生的对象,然后使用G进行一些计算,这不会改变N个派生的对象,然后G超出范围,并与之构成N派生的对象。N派生的对象又包含指向添加到同一G对象的其他N派生的对象的指针或指针的标准容器。G表示具有异构节点的图。我的目标是:最小化分配每个N派生对象的成本。最大化属于同一G对象的N派生对象的引用位置。通过为所有N派生的对象分配一个块来最大程度地减少重新分配的成本。能够定义具有独立生命周期的多个独立G对象-潜在地在并发线程中管理这些独立G对象,而无需线程同步。在我

c# - block 分配

是预分配(例如)100KB内存(在堆中)然后只继续使用60KB更好,还是根据需要分配每个字节更好?我的问题来自阅读此博客:http://deplinenoise.wordpress.com/2012/10/20/toollibrary-memory-management-youre-doing-it-wrong/ 最佳答案 这实际上取决于应用程序的复杂内存细节。然而,这家伙的基本观点是绝对准确的——预分配和内存区域非常高效。new和delete是最通用的工具,如果您有更具体的问题,您可以找到更有效的解决方案。固定大小的对象池是另一个

c++ - 删除 std::vector 的元素(并更改大小)而不影响分配的内存

我正在使用如下代码:constintMY_SIZE=100000;std::vectorv;v.reserve(MY_SIZE);//addnomorethanMY_SIZEelementstothevectorf(v);v.clear();//again,addnomorethanMY_SIZEelementstothevectorf(v);v.clear();////etc...//我的代码的重点是存储MY_SIZEdouble的然后执行操作f(std::vector)在那些元素上。在我填满vector并执行操作后,我想去掉所有元素(并将std::vector::size()重置为

c++ - 覆盖 operator new 以合并 PIMPL 分配

PIMPL习语通常用于对象的公共(public)API,有时也包含虚函数。在那里,堆分配通常用于分配多态对象,然后将其存储在unique_ptr或类似的地方。一个著名的例子是QtAPI,其中大多数对象(尤其是QWidgets等)在堆上分配并由QObject父/子关系跟踪。因此,我们为两次分配支付费用,一次是对象本身使用2*sizeof(void*)来保存PIMPL和v_table指针,一次是私有(private)数据本身。现在来回答我的问题:我想知道这两个分配是否可以合并,类似于make_shared应用的优化。然后我想知道这种优化是否值得,因为malloc的实现可能非常擅长处理字大小

c++ - 用于实时数据采集的快速内存分配

我有一系列连接到PC的传感器,用于测量各种物理参数,例如力、转速和温度。这些传感器以一定的采样率连续生成样本。样本由时间戳和测量维度本身组成;采样率的数量级为个位数千赫兹(即,介于每秒1到9000个样本之间)。PC应该在给定的时间段内读取并存储这些样本。之后,收集的数据将得到进一步处理和评估。缓冲样本的明智方法是什么?在一些实际的设置中,采集可以很容易地每秒收集几兆字节。如果内存分配速度很快但需要在写入时交换,分页也可能很关键。我可以想到一种线程方法,其中一个单独的线程分配和管理一个池(锁定,因此不可交换)内存块。假设总是有足够的这些block被预先分配,进一步的分配只会阻塞(如果其他

c++ - 预测 kD 树中所需的预分配节点数

我正在以广度优先的方式在数组表示中实现动态kD-Tree(将节点存储在std::vector中)。每个i-th非叶节点在(i处有一个左子节点和一个合适的child在(i.它将支持点的增量插入和点的集合。但是,我在确定增量预分配空间所需的可能节点数时遇到了问题。我找到了formulaontheweb,这似乎是错误的:N=min(m−1,2n−½m−1),wheremisthesmallestpowerof2greaterthanorequalton,thenumberofpoints.我对公式的实现如下:size_trequired(size_tn){size_tm=nextPowerO