草庐IT

分配数

全部标签

c++ - new操作分配的内存是连续的吗?

如题所示,我想知道在c++中,一个new操作分配的内存是否连续... 最佳答案 BYTE*data=newBYTE[size];在此代码中,无论给定大小,返回的内存区域都是连续。如果堆管理器不能分配size的连续内存,则失败。将返回异常(或malloc中的NULL)。程序员总是会在进程的地址空间中看到连续(是的,无限:-)内存的错觉。这就是虚拟内存为程序员提供的。请注意,程序员(少数嵌入式系统除外)总是看到虚拟内存。然而,几乎连续的内存可以以任意方式映射到物理内存中(以“页面”大小为粒度,通常为4KB)。该映射您看不到,而且大多数情

c++ - C++中的内存泄漏/内存分配

我在C++中有以下函数voidfunc1(){char*p="Testformemoryleak";}当func1()被调用时,变量的内存分配在哪里?是在栈中还是堆中?是否应显式调用deletep;? 最佳答案 字符串文字的内存分配在静态存储中,分配持续时间是整个程序运行时间。您不应该调用delete-调用delete会导致未定义的行为。 关于c++-C++中的内存泄漏/内存分配,我们在StackOverflow上找到一个类似的问题: https://stac

c++ - 如何为变量分配别名

我想用不同的名字调用同一个变量,我该如何给它分配一个别名?我是否坚持使用宏,比如#DEFINEVariableAlias总结:我更喜欢在C中应用它我有一个信号可以是不止一种类型的变量(温度、距离等)我想为该信号分配多个别名我目前在C语言中使用函数作为重命名方法。所以给定变量:intsignal我会做以下事情intTemperature(){returnsignal;} 最佳答案 在C++中为变量提供别名的方法是使用引用。例如,inti=42;int&j=i;//jisanaliasforiconstint&k=j;//kisanal

c++ - 用于快速 std::wstring 分配的自定义分配器

是否有任何开源分配器(可能在Boost中)可以与std::wstring一起使用,实现快速分配模式,如thisblogpost中所示?Boost.Pooldoesn'tseemwellsuitedforthispurpose. 最佳答案 不,没有(我搜索了几个小时,一次)。如果您不关心在使用过程中释放内存,那么您自己做起来相当简单。如果要动态释放,那么freelist管理、LRU等工作就变得很多了。 关于c++-用于快速std::wstring分配的自定义分配器,我们在StackOver

深入分析arm的程序启动过程内存分配和加载区域运行区域的关系

STM32的启动过程一启动代码启动代码由MCU研发商提供。MCU一上电,首先执行的是启动代码,她是一个汇编代码。以stm32f1为例:首先定义堆栈,然后定义中断向量表,然后执行复位中断服务函数Reset_Handler;ResethandlerReset_HandlerPROCEXPORTReset_Handler[WEAK]IMPORT__mainIMPORTSystemInitLDRR0,=SystemInitBLXR0LDRR0,=_mainBXR0ENDPReset_Handler首先调用SystemInit,配置和运行时钟系统,然后执行_main函数,在__main里面对堆栈、中断向

c++ - 在特定位置分配多态类成员?

我有一个包含几个类成员和一个多态成员的类:classContainer{Container::Container(){p=newDerived();}Poly*p;Aa;Bb;};我想为Container::p指向的实际多态对象分配内存,在Container::b之后连续分配,而不是通过默认的new()和因此malloc()。实现此目标的最佳方法是什么? 最佳答案 在某种程度上,细节取决于Container构造函数如何决定Poly的具体类型。据推测,这种选择可能会有所不同。否则,只需在b之后声明一个Derived成员即可。但是假设这

c++ - 调用时为 std::function 分配新值

inti=9;struct_variable.f=[i](Tstruct_variable&){do_something_with_capture_variable(i);...struct_variable.f=another_compatible_std_function;//dosomethingelse,butneverusecapturedvariableafterhere...};struct_variable.f(struct_variable);lambda函数被保存为成员struct_variable.f(也是类型std::function),在回调中,struct_

c++ - 是否允许编译器优化堆内存分配?

考虑以下使用new的简单代码(我知道没有delete[],但它不属于这个问题):intmain(){int*mem=newint[100];return0;}是否允许编译器优化new调用?在我的研究中,g++(5.2.0)和VisualStudio2015不优化new调用,whileclang(3.0+)does.所有测试都是在启用完全优化的情况下进行的(-O3用于g++和clang,用于VisualStudio的Release模式)。new不是在幕后进行系统调用,使得编译器不可能(并且非法)对其进行优化吗?编辑:我现在已经从程序中排除了未定义的行为:#includeintmain()

c++ - 线程分配的内存块是否与线程本身具有相同的亲缘关系,直到线程退出?

这是一个关于NUMA的问题。例如,在下面的代码中,缓冲区是否在线程/进程的整个生命周期的本地内存中分配?for(intth=0;th更新:为了使问题更直接,让我这样问。如果我同时启动了10个线程(比如t0到t9),并且在每个线程的范围内,它会分配一个内存块(比如m0到m9)。在线程退出之前,线程t_n是否总是在m_n(n从0到9)上运行,或者线程0可能会迁移并在内存9上运行?在我的情况下,内存块不是很大,通常只有几兆字节。 最佳答案 我认为这种行为与操作系统的实现有关,但我相信对于使用CONFIG_NUMA选项配置和构建的Linux

c++ - 用户调用 operator new 时的分配/对象详细信息拦截和收集问题

我正在开发一个小型内存工具,它可以跟踪分配和释放、对象大小、对象类型等。我用来跟踪源文件、行号和对象类型的方法是这样工作的:#defineDEBUG_NEWSourcePacket(__FILE__,__LINE__)*new#definenewDEBUG_NEWSourcePacket只是一个小类,它在构造期间接受一个constchar*和一个int。这些值通过__FILE__和__LINE__宏填充。对象类型是这样获取的:templateT*operator*(constSourcePacket&packet,T*p);p是指向新分配对象的指针,其类型使用RTTI发现。在运算符重载