草庐IT

c++ - 内存重新分配 - 保留我的数据

假设我在堆中有一些数组,由malloc或new构造并不重要。我需要最有效的方法来放大它。我的意思是,如果它有足够的可用空间位于已分配的数据之后,我可以保持我的数据不变。是否可以在C++中维护?realloc是否以这种方式工作? 最佳答案 是的,realloc就是您要找的。请注意,它不适用于new,您必须使用malloc(或者说,calloc)。另外,有时扩展内存是不可能的,所以realloc会尝试为你做这件事,但如果不能——它会求助于分配新内存,将你的内容复制到一个新地方并释放旧内存。

c++ - 为什么预分配函数指针的性能比分支差?

我有一个带有enum成员变量的类。其中一个成员函数基于此enum的行为,因此作为“可能的”优化,我将两种不同的行为作为两个不同的函数,并为类提供了一个在构造时设置的成员函数指针.我模拟了这样的情况:enumcatMode{MODE_A,MODE_B};structcat{cat(catModemode):stamp_(0),mode_(mode){}voidupdate(){stamp_=(mode_==MODE_A)?funcA():funcB();}uint64_tstamp_;catModemode_;};structcat2{cat2(catModemode):stamp_(0

c++ - SIMD 和动态内存分配

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:SSE,intrinsics,andalignment我是SIMD编程的新手,如果我问的是一个明显的问题,请原谅。我进行了一些试验,最终我想将SIMD值存储在动态分配的结构中。代码如下:structSimdTest{__m128m_simdVal;voidsetZero(){__m128tmp=_mm_setzero_ps();m_simdVal=tmp;//setZero();deletetest;}执行带有CRASH注释的方法时,代码崩溃,异常如​​下:Unhandledexceptionat0x7753

c++ - 分配两个数组一次调用 cudaMalloc

内存分配是GPU中最耗时的操作之一,因此我想通过使用以下代码调用一次cudaMalloc来分配2个数组:intnumElements=50000;size_tsize=numElements*sizeof(float);//declarations-initializationsfloat*d_M=NULL;err=cudaMalloc((void**)&d_M,2*size);//errorchecking//AllocatethedeviceinputvectorAfloat*d_A=d_M;//AllocatethedeviceinputvectorBfloat*d_B=d_M+

c++ - 检测堆栈或堆分配

我有一个类,我希望能够在其中设置一个标志,说明它是否是堆分配的,这样它就可以正确地清理自己,而不是在堆栈上尝试删除自己。问题是……我似乎无法同时覆盖new和构造函数。所以它从设置isHeapAllocated标志的new重载开始,然后进入重置标志的构造函数。void*String8::operatornew(size_tsize){String8*string=(String8*)malloc(size);if(string==null)Exception("allocationfail:nofreememory");string->isHeapAllocated=true;retur

c++ - 抛出的对象分配在哪里?

这个问题在这里已经有了答案:Howareexceptionsallocatedonthestackcaughtbeyondtheirscope?(6个答案)关闭9年前。例如,当我在函数中使用throw时try{//...throwMyExceptionType()//...}catch(MyExceptionType&exp){/*...*/}MyExceptionType分配在哪里?它在堆栈上吗?如果是这样,在我的catchblock中修改exp是否安全?在catch中调用一些其他函数并使用堆栈怎么样?在类似的情况下,我有:try{charmy_array[32];throwmy_a

c++ - 全局分配函数和 const void*

根据C++11,下面的代码是否构成“未定义行为”(由于使用了const_cast,请参见下面的引用)?constvoid*p=operatornew(123);operatordelete(const_cast(p));来自C++11标准(3.7.4.2.3)的相关引述:Thevalueofthefirstargumentsuppliedtoadeallocationfunctionmaybeanullpointervalue;ifso,andifthedeallocationfunctionisonesuppliedinthestandardlibrary,thecallhasnoeff

c++ - 将两个 8 位位集分配给一个 16 位位集

有什么方法可以将两个8位位集分配给一个16位位集例如bitsetfirst=var1;bitsetsecond=var2;bitset=first+second; 最佳答案 如果您希望它们被序列化:bitsetresult(first.to_ulong()*0x100+second.to_ulong());这使得第一位成为最高位,第二位成为最低位。 关于c++-将两个8位位集分配给一个16位位集,我们在StackOverflow上找到一个类似的问题: http

c++ - std::deque 什么时候需要重新分配?

据我所知,std::deque以block的形式存储它的元素(虽然它依赖于实现,但这是我在大多数来源中读到的)而不是std::vector在大多数情况下使用单个内存块。因此,std::vector在插入过程中遇到重新分配是很合理的。但是,我无法将需要为std::deque重新分配的任何情况联系起来,因为当电流耗尽时,它只是从新的内存块开始。任何人都可以向我提供一个案例,其中std::deque由于对其执行了某些操作而需要重新分配吗? 最佳答案 Cananyoneprovidemewithcasewherestd::dequeneed

c++ - 编译器如何为类分配内存?

当我创建一个带有类指针的类时:classA{B*p_b1;B*p_b2;A(){}}我假设编译器为每个A实例至少生成2个指针大小的空间。我的问题是,如果它们不是指针而是直立的对象,例如:classA{Bb1;Bb2;A(){}}编译器会不会在A类的内存空间内为b1和b2分配空间?或者它会在堆栈的其他地方声明实际的B类吗?我问这个问题的原因是因为我试图减少我的代码中的内存分配,并且正在徘徊它是否会产生任何影响。 最佳答案 Willthecompilerallocatespaceforb1andb2withinthememoryspac