草庐IT

信道分配

全部标签

c++ - PIMPL 和堆栈分配

所以我一直在思考PIMPL和堆栈分配。我一直在编写一个库,并决定使用PIMPL来隐藏该类的私有(private)成员。这意味着我将有一个这样声明的类classFoo{private:classHandle;std::tr1::shared_ptrhandle;public:Foo();};这很简单。但是然后在构造函数中你这样做Foo::Foo():handle(newHandle()){}因此,当使用我的库的人在堆栈上创建Foo时,他们实际上是在进行堆分配。这是您在使用PIMPL时必须忍受的权衡吗?我想在构造函数旁边发布带有警告的文档:“警告:这会导致堆分配”或类似的内容。我的另一个想

C++内存分配问题

我的代码如下:#includeintmain(){intii=123;charstr[7]="";strcpy(str,"123456");return0;}我在VS2010中运行,内存如下我很好奇内存中的cc是干什么用的?cc的个数又是如何计算的? 最佳答案 在VisualStudio中为“调试”进行编译时,cc通常用于填充未初始化的内存。这样,当您访问未初始化的内存时,它会更加明显。例如,如果您尝试取消引用一个未初始化的指针,您可能会得到如下内容:AccessViolationaccessing0xcccccccc或类似的东西。

c++ - 预分配内存空间供程序使用

在我的Windows的C++程序中,我通过调用newCMyClass()在堆上分配了几个小对象(数千个)性能似乎因此受到影响。有没有办法在堆中预先分配一些最小内存供程序使用,以便操作系统在我调用newCMyClass()以提高性能时从这个预先分配的空间开始分配?谢谢。 最佳答案 您似乎在寻找内存池-http://www.codeproject.com/Articles/27487/Why-to-use-memory-pool-and-how-to-implement-it请注意,您可以预先分配一些内存,然后使用placementne

c++ - 分配 'this' 指针的内存

在C++中,this指针作为隐藏参数传递给方法,它实际上指向当前对象,但是“this”指针存储在内存中的什么位置......在堆栈、堆中,数据在哪里? 最佳答案 标准没有指定this指针的存储位置。当在函数调用中将其传递给成员函数时,一些编译器将其传递到寄存器中,而其他编译器将其传递到堆栈中。它还可能取决于编译器选项。关于您唯一可以确定的是this是一个基本类型的右值,因此您不能获取它的地址。并非总是如此。在准标准C++中,您可以分配给this,例如为了指示构造函数失败。这是在引入异常之前。指示构造失败的现代标准方法是抛出异常,以保

c++ - 我怎样才能让 QThread 在不泄漏的情况下发出堆分配的 QObject?

我的情况是我有一个QWidget派生类MyWidget,它将创建一个QThread派生类(WorkerThread)以在其run()方法中执行一些不间断的阻塞工作。其结果是QObject派生类(DataClass)的堆分配实例,然后由MyWidget接收和处理。不过,MyWidget是一个临时小部件,可能会在WorkerThread仍在运行时因用户操作而被删除。下面是一些伪代码来说明这一点:#include#includeclassDataClass:publicQObject{Q_OBJECTpublic://containssomecomplexdata};classWorkerT

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上找到一个类似的问题: