19得票6回答
为什么malloc()会交替调用mmap()和brk()?

我对C语言和堆内存不太熟悉,仍在努力理解动态内存分配。 我追踪了Linux系统调用,并发现如果我使用malloc请求一小部分堆内存,那么malloc会在内部调用brk。 但是如果我使用malloc请求大量的堆内存,那么malloc会在内部调用mmap。 所以brk和mmap之间必须存在很大的区...

19得票5回答
calloc比malloc更好吗?

我最近才学习了C语言中的calloc()函数。阅读了它的描述以及与malloc的区别 (1, 2)后,我认为,作为一名非嵌入式程序员,我应该总是使用calloc()。但这是否真的是这样呢? 我有一个保留意见,就是访问calloc()分配的内存会有额外的延迟,但我也想知道是否有一些情况,在这些...

19得票2回答
C++单例类实例的堆/动态与静态内存分配

我的具体问题是,在C++中实现单例类时,以下两种代码在性能、副作用或其他方面是否有实质性差异: class singleton { // ... static singleton& getInstance() { // allocating o...

18得票3回答
理解新处理程序的行为

我正在阅读Scott Meyers的《Effective C++ 55》并从第49项中有一个问题: 当operator new无法满足内存请求时,它会重复调用new-handler函数,直到找到足够的内存为止。 设计良好的新处理程序函数必须执行以下操作之一: 提供更多可用内存。 安装其他...

18得票1回答
CUDA new delete

有人能清楚地解释一下,在CUDA 4.2中如果从__device__或__global__代码调用new和delete关键字,它们的行为会如何?内存分配在哪里进行,如果在设备上,是本地的还是全局的? 就问题背景而言,我试图在GPU上创建神经网络,我想要一个链式表示(类似于链表,但每个神经元存...

18得票4回答
为什么运行环境不能决定是应用delete还是delete[]而需要程序员来决定?(这是一个关于IT技术的问题)

我读到过delete[]运算符是必需的,因为运行时环境不能保留分配块是否为需要调用析构函数的对象的信息,但它确实可以保留分配块存储在内存中的位置和块的大小。 只需要一个额外的元数据位来记住是否需要在delete时调用析构函数,那么为什么不这样做呢? 我很确定有一个很好的解释,我不怀疑它,我只...

18得票3回答
::operator new(size_t)使用malloc()吗?

::operator new(size_t)会在内部调用malloc(),还是直接使用系统调用/特定于操作系统的库调用?C++标准有什么说法? 在this answer中提到: malloc()保证返回对于任何标准类型都对齐的地址。::operator new(n)仅保证返回对于任何不大...

17得票5回答
混合使用operator new[]和placement new以及普通delete[]的问题

只是出于好奇,以下内容是否合法?X* p = static_cast<X*>(operator new[](3 * sizeof(X))); new(p + 0) X(); new(p + 1) X(); new(p + 2) X(); delete[] p; // Am I...

17得票7回答
在C语言中动态分配二维数组

我不太理解一些C语言的基本概念,比如动态分配二维数组。 我知道可以这样做:int **m; 为了声明一个二维数组(随后可以使用某些*alloc函数来分配),也可以通过*(*(m + line)+column)轻松访问它。但是,我该如何为该数组中的元素赋值?使用gcc时,以下语句m[line][...

17得票3回答
C#如何动态为List<T>分配内存?

根据LukeH在C#中List&lt;string&gt;的最大数据限制是什么?中的回答,目前实现的List中可以存储的元素数量理论上为Int32.MaxValue,略大于20亿。 我们可以看到List可以容纳大量的项。我假设编译器并不会为每个新的List&lt;T&gt;实现释放2亿次T...