草庐IT

延时分配

全部标签

c++ - STL算法和back_inserter可以预分配空间吗?

如果我有类似的东西:vectorlongVector={...};vectornewVector;transform(longVector.begin(),longVector.end(),back_inserter(newVector),[](inti){returni*i;});STL是否能够在处理和添加新元素之前在newVector中预分配空间?我知道这不是算法的要求,但是“好的”实现能够优化它吗?或者,对于这种情况,我应该更喜欢在之前添加newVector.reserve(longVector.size());吗?我不一定要问每个stdlib实现是否有(尽管如果有人知Prop体

c++ - 如果 new_size 不大于旧的,C++ 标准是否保证 std::string::resize(new_size) 不会导致分配?

这个问题在这里已经有了答案:Doesthestandardguarantee,thatstd::string::resizewillnotdoreallocatememory,ifthenewsizeislessthanorequaltoastheoldone?(1个回答)关闭3年前。#include#includeintmain(){autos="hello"s;autop=&s[0];s.resize(3);assert('h'==*p);//alwaysok?}如果new_size不大于旧的,C++标准是否保证std::string::resize(new_size)不会导致分配

c++ - 动态分配内存

让我们考虑以下两个代码首先:for(inti=0;i第二个:for(inti=0;i峰值内存使用率几乎相同,但第二个代码的运行速度比第一个快约20倍。问题是不是因为第一个代码数组存储在堆上,第二个数组存储在堆栈上? 最佳答案 Isitbecauseinfirstcodearrayisstoredonheap,andinthesecondonearrayisstoredonstack?是的,堆栈分配要快得多,因为第二个代码示例所做的只是移动(添加/减去)堆栈指针而不是操作堆。如果想了解更多,这两个问题涵盖了主题C++Whichisfa

C++11:为什么允许分配右值?

据我了解,从函数返回右值引用是危险的原因是由于以下代码:T&&f(T&&x){do_something_to_T(x);returnstatic_cast(x);}Tf(constT&x){Tx2=x;do_something_to_T(x2);returnx2;}T&&y=f(T());这使得y成为未定义的悬挂引用。但是,我不明白为什么上面的代码甚至可以编译?是否有合理的理由将右值引用分配给另一个右值引用?粗略地说,右值不应该是“临时值”,即在表达式末尾无效吗?能够分配它们对我来说似乎很愚蠢。 最佳答案 Aren'trvalues

C++ vector 减少分配大小

在实践中,C++vector何时会动态减少其分配的大小。我知道在插入完整vector时分配的空间会加倍,但我不清楚分配减少的时间。经典滞后是在从1/4满vector中移除时将分配大小减半。 最佳答案 如果没有明确指示,它永远不会缩小分配的内存。在C++11中,有一个shr​​ink_to_fit调用会要求实现执行此操作,但它可能不会减少分配的内存。在以前的版本中,您必须创建一个新拷贝并交换旧拷贝。 关于C++vector减少分配大小,我们在StackOverflow上找到一个类似的问题:

c++ - 为什么在使用复制分配运算符时需要删除资源?

例如我的一本书中的代码:classHasPtr{public:HasPtr(constHasPtr&h):ps(newstd::string(*h.ps)),i(h.i){}HasPtr(conststd::string&s=std::string()):ps(newstd::string(s)),i(0){}HasPtr&operator=(constHasPtr&);~HasPtr(){deleteps;}private:std::string*ps;inti;};HasPtr&HasPtr::operator=(constHasPtr&rhs){autonewp=newstrin

c++ - 为什么 C++ 自定义分配器需要比较运算符?

在实现自定义C++分配器时,需要定义:operator==用于不同value_type的分配器operator!=用于不同value_type的分配器您可以在documentationofAllocatorconcept中查看自定义分配器的示例实现:#include#includetemplatestructMallocator{typedefTvalue_type;Mallocator()=default;templateconstexprMallocator(constMallocator&)noexcept{}T*allocate(std::size_tn){if(n>std::

c++ - 零大小数组分配是什么/意味着什么?

查看一些示例代码并遇到一些零大小数组分配。我创建了以下代码片段来澄清我的问题这是有效的代码:classT{};intmain(void){T*ptr=newT[0];return0;}它有什么用?ptr有效吗?这个构造是可移植的吗? 最佳答案 C++标准中的5.3.4:6direct-new-declarator中的每个constant-expression都应是整型常量表达式(5.19)并求值为严格的正值。direct-new-declarator中的expression应具有非负值的整数或枚举类型(3.9.1)...7当dire

c++ - new() 是否也为类的函数分配内存?

classAnimal{public:inta;doubled;intf(){return25;}};假设上面的代码,我尝试通过说newAnimal()来初始化一个对象,这个new()是否也为函数分配内存f()?换句话说,如果我改用这个类并执行newAnimal(),在内存分配方面有什么不同?:classAnimal{public:inta;doubled;}; 最佳答案 对于没有虚函数的类,函数本身不占用数据空间。函数是可以执行以操作数据的代码段。必须分配的是数据成员。当你有一个虚类时,通常会有一个额外的虚表指针。请注意,vtab

c++ - 如果我不遵守无状态自定义分配器教条,会发生最糟糕的情况吗?

我需要为std::对象创建自定义分配器(特别是最初是为std::vector),但它最终可能会使用其他分配器我需要创建自定义分配器的原因是我需要跟踪应用程序各个组件分配的(堆和堆栈)资源(这是应用程序的固有特性)。我将需要自定义分配器来监视资源的堆部分,因此我必须能够向std::vector构造函数传递类似于trackerIdidToTrackUsage;myAllocaallocator(idToTrackUsage);vectorFoo(allocator);然而,在阅读了一些之后我发现了这个关于STL/C++标准的小炸弹(见引用资料)说给定类型的所有分配器实例应该是等价的(也就是