草庐IT

延时分配

全部标签

c++ - 使用带有 boost::bimap 的自定义分配器

我正在努力boost同时使用Boost图形库和boost::bimap的程序的性能。分析显示大部分时间都花在了内存分配和释放上。使图形库的adjacency_list类使用boost::fast_pool_allocator显着boost了性能。剩余内存分配的很大一部分发生在boost::bimap中,因此我也想尝试在那里使用自定义分配器。documentation说您可以将分配器指定为bimap的最后一个模板参数,但它没有说明分配器本身的模板参数应该是什么类型。例如,对于类型X和Y,在boost::bimap,set_of,boost::fast_pool_allocator>Z应该

c++ - 将 std::uninitialized_fill() 与任何分配器一起使用是否有意义?

用std::uninitialized_fill()初始化内存有意义吗?当用户作为参数传递的分配器已用于获取内存本身时,在库中?我问这个是因为分配器应该提供自己的construct()方法(allocate()方法除外),其实现可能与标准方法不同,因此可能是std::uninitialized_fill()并不总是适用于所有情况。准确的说,我的疑惑来自Stroustrup写的C++书(附录E“Standard-LibraryExceptionSafety”,E.3.1节),书中作者给出了一个templatevector::vector(size_typen,constT&val,con

c++ - 为最终的 future 自定义内存分配器做准备

我的项目是在c++11中,使用vs2012。现在我觉得不需要使用自定义内存管理,但是我应该采取什么安排以促进最终的future修改?我想过为“new”/“new[]”/“delete”/“delete[]”使用宏,为容器和智能指针使用typedef。什么是最佳实践? 最佳答案 在我看来,您所要做的基本上就是确定您将在整个实现过程中使用的特定约定。让你的架构分配器知道的一个很好的模板是看看这是如何为STL容器实现的,并尝试设计你像它们一样的数据结构。例如,如果您在std::vector上查找示例interface此容器的第二个参数始终

c++ - 如何创建 C++ 11 非默认可构造分配器?

这个主题出现在这个线程中,关于VisualStudio2015的std::list::sort()的变化:`std::list::sort()`-whythesuddenswitchtotop-downstrategy?新版本的std::list::sort不需要默认可构造的std::list,因为它只使用迭代器,并且不创建任何本地列表,所以列表是否可以并不重要'不是默认构造的。之前的版本使用本地列表(注意-列表的每个实例都涉及一个哨兵节点的动态分配):typedeflist_Myt;//...constsize_t_MAXBINS=25;_Myt_Templist,_Binlist[

c++ - 开关状态案例中的不同类型分配,内部模板函数

苹果.hclassApple{public:Apple(int);staticinttypeID;private:intid_;};苹果.cpp#include"Apple.h"Apple::Apple(intpID){id_=pID;}Potato.h,Potato.cpp与苹果相同存储.h#pragmaonce#include"Apple.h"#include"Potato.h"#includeclassStorage{public:Storage();templatevoidstore(foodName*object){(*getBasket()).push_back(objec

c++ - 是否可以更改C/C++中自动变量的分配区域?

这是C和C++的理论问题。我有一个4x4矩阵类型,其定义非常简单:typedeffloatMatrix44[16];我还有很多方法将Matrix44作为参数,例如:boolmatrixIsIdentity(Matrix44m);我还有一个自定义的内存分配方案,即在堆上预分配大面积内存,然后我手动管理预取内存的分配。因此,我用自己的实现替换/重载了malloc/new。问题是,自定义malloc和new本质上都返回指针,而不是对象。通常,我会简单地执行以下操作://Method11]Matrix44mat={...};2]boolres=matrixIsIdentity(mat);但是,

c++ - 动态分配二维智能指针数组的语法

我需要动态分配一个二维智能指针数组,但它的语法让我感到困惑。我需要它是动态的:std::unique_ptrmyArray[size1][size2];因此据我了解,我创建了一个指向该类型指针的指针:someClass**myArray;//actaullythetypeisstd::unique_ptrbutI'lljustkeepitsimple然后分配它:myArray*=newsomeClass*[size1];for(inti=0;i但这并没有使用智能指针,这意味着我以后必须手动删除它,而且我不知道如何使这些指针成为智能指针;类型是std::unique_ptr但我需要一个指

c++ - 为 std::map 中的 std::array 分配多个值

当使用std::array时,我可以一次赋值:std::arraya2={1,2,3};但是当上面的数组组合成一个映射时,我不知道最好的方法:usingnamespacestd;map>myMap;//I'mdoingitlikebelownow...arraytempArray={1,2,3};//canIsavethislinesomehow?myMap[myString]=tempArray;如果这实际上是正确的方法,请告诉我。谢谢! 最佳答案 虽然使用另一个答案中所示的insert效率更高,但您也可以使用myMap["foo

c++ - Boost 进程间分配器 - 管理文件大小

首先,我将概述带有源的域。namespacebip=boost::interprocess;typedefbip::allocatorallocator;typedefbip::vectorvector;bip::managed_mapped_filem_file(open_or_create,"./file",constant_value);bip::allocatoralloc(m_file.get_segment_manager());bip::vector*vec=m_file.find_or_construct("vector")(alloc);我不关心底层文件的最终大小,但

c++ - C++中动态分配内存的碎片整理

动态分配内存(使用new和malloc运算符分配)的碎片整理在C++中如何工作? 最佳答案 C++堆中没有碎片整理,因为应用程序可以自由保留指向已分配内存的指针。因此堆管理器不能移动已经分配的内存。唯一可能的“碎片整理”是释放两个相邻的block。然后堆管理器会将这两个block组合成一个更大的空闲block,可以再次用于分配。 关于c++-C++中动态分配内存的碎片整理,我们在StackOverflow上找到一个类似的问题: https://stackove