C++ 关于内存分配和C++;

C++ 关于内存分配和C++;,c++,visual-studio,visual-c++,C++,Visual Studio,Visual C++,我引用MSDN的话: malloc函数具有 运行时的缺点 依赖的。新接线员拥有 作为编译器的缺点 依赖性和语言依赖性 现在的问题是: a) malloc依赖于运行时是什么意思?什么样的动态内存分配函数可以独立于运行时?这句话听起来很奇怪 b) 新语言依赖于语言吗?当然应该是对的?HeapAlloc、LOCALLOC等语言是否独立 c) 从纯性能的角度来看,MSVC提供的例程是否更可取 Arpana)这意味着malloc的行为取决于编译所依据的C运行时的版本 b) HeapAlloc和LocalA

我引用MSDN的话:

malloc函数具有 运行时的缺点 依赖的。新接线员拥有 作为编译器的缺点 依赖性和语言依赖性

现在的问题是:

a) malloc依赖于运行时是什么意思?什么样的动态内存分配函数可以独立于运行时?这句话听起来很奇怪

b) 新语言依赖于语言吗?当然应该是对的?HeapAlloc、LOCALLOC等语言是否独立

c) 从纯性能的角度来看,MSVC提供的例程是否更可取

Arpan

a)这意味着malloc的行为取决于编译所依据的C运行时的版本

b) HeapAlloc和LocalAlloc是Win32 API函数。它们实际上是独立于运行时和语言的

c) 如果不知道运行时例程是如何实现的,这是不可能回答的。我怀疑他们的表现是可压缩的。在任何情况下,如果使用新操作符,则始终可以选择稍后在必要时覆盖它。记住,过早优化是万恶之源

最后一点注意:LocalAlloc和GlobalAlloc速度较慢。你不应该使用它们,除非是因为一个粗糙的旧Win32 API而被迫使用。

a)在这种情况下,我认为它们将“运行时库”替换为“运行时库”。换句话说,它取决于C库中的实现

P< b)确实是新的C++特异性。HeAPOLLC等在C和C++中是技术上可用的。

C)它们不能用来创建C++对象,因为它们不调用构造函数,所以这一点很不成熟。在C++中,应该使用新的和Dele.</P> < P>使用MLALC的问题,并且在使用DLL时出现新的问题。根据构建选项,DLL可能有自己的CRT副本。这使得它使用自己的堆从一个不同于EXE使用的堆中分配内存。当内存由一个模块分配而由另一个模块释放时,这会导致故障。使用STL时非常常见

解决这个问题的一种方法是使用/MD选项编译代码。这将强制使用存储在自己DLL中的CRT共享副本。问题解决了,现在只有一个分配器,使用一个堆

COM也会出现这个问题,它允许不同的语言进行互操作。当然,它们永远不会共享分配器,因为这些语言具有不同的运行时支持库。根据约定,COM代码必须使用COM运行时支持提供的单个分配器CoTaskMemAlloc()

请注意,HeapAlloc()无法解决此问题。它需要HeapCreate()返回的堆句柄。不同的模块必须共享该句柄以避免出现问题



更新:在VS2012中,CRT现在从一个共享堆进行分配,这是默认的进程堆(GetProcessHeap函数)。

哇,这是一个奇怪的语句,出现在文档中,没有附带解释。这是否是C++引入时的一个保留?我只能猜测你的问题的答案:

a) 也许他们的意思是将其与链接/加载时间分配进行对比,例如全局、常量和
静态
数据。或者他们可能想将其与堆栈分配进行对比,例如
alloca
系列

b)他们可能会注意到,C++不应该用C++ <代码> < < />代码>分配内存,然后将该内存的所有权传递给库程序,该程序可以是代码> For()/<代码>。因此,从这个意义上说,分配的结果是特定于语言的


< P> C)使用C++ <代码>新< /COD>和<代码>删除< /代码>。您必须假设MSVC运行时的底层C++分配器与C样式系统调用一样快,如果不是相同的话。只要记住
new
delete
所做的不仅仅是分配和释放内存。它们不能完全被
malloc
free
或其他C风格的分配器替代

用评论来评论他的回答,而不是在这里;当然,在运行时对内存的每个“真实”请求都依赖于运行时。新的操作符当然是依赖于语言的。。。但是编译器依赖?!如果我们谈论C++,它是标准化的,我希望<>代码>新< /Cord>行为不是编译器依赖的;它是如何实现其目的的当然取决于编译器(但这也是一个无趣的细节)和系统相关的…(毕竟是malloc)…如果您想使用可移植的分配器,请重新定义全局
运算符new
。更不用说HeapAlloc和friends也是windows特定的-如果您使用它们,使代码可移植的唯一方法是为其他平台制作自己的HeapAlloc。。。当你可以使用malloc/free或new/delete时,为什么还要麻烦呢?