- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以,我有这段代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *p;
long n = 1;
while(1) {
p = malloc(n * sizeof(char));
//p = calloc(n, sizeof(char));
if(p) {
printf("[%ld] Memory allocation successful! Address: %p\n", n , p);
n++;
} else {
printf("No more memory! Sorry...");
break;
}
}
free(p);
getch();
return 0;
}
然后我在 Windows 上运行。有趣的事情:
如果我们使用 malloc,程序会分配大约 430 MB 的内存然后停止(照片在这里 => http://i.imgur.com/woswThG.png)
如果我们使用 calloc,程序会分配大约 2 GB 的内存然后停止(照片在这里 => http://i.imgur.com/3JKy5pA.png)
(奇怪的测试):如果我们同时使用它们,它最多使用 (~400MB + ~2GB)/2 => ~1.2GB
但是,如果我在 Linux 上运行相同的代码,分配会一直持续(在分配了 600k 并使用了许多 GB 之后,它仍然会继续,直到最终被终止)并且使用的内存量大致相同。
所以我的问题是:他们不应该分配相同数量的内存吗?我认为唯一的区别是 calloc 用零初始化内存(malloc 返回未初始化的内存)。为什么它只发生在 Windows 上?它既奇怪又有趣。
希望你能帮我解释一下。谢谢!
编辑:
Code::Blocks 13.12 与 GNU GCC 编译器
Windows 10 (x64)
Linux Mint 17.2“Rafaela”- Cinnamon(64 位)(用于 Linux 测试)
最佳答案
查看程序输出,你实际上分配了相同数量的 block ,65188
用于malloc
,65189
用于calloc
。忽略开销,这略小于 2GB 内存。
我的猜测是您在 32 位模式下编译(指针被转储为 32 位),这将单个用户进程可用的内存量限制在 2GB 以下。进程图显示的不同之处在于您的程序如何使用它分配的内存。
malloc
版本不涉及分配的页面:其中超过四分之三的页面未实际映射,因此仅 430MB。
calloc
版本显示 2GB 的映射内存:您的 C 库函数 calloc
很可能会清除分配的内存,即使对于从操作系统。这不是最佳的,但只有在您不触摸分配的内存时才可见,无论如何都是一种特殊情况。然而,不清除从操作系统获取的页面会更快,因为它们被指定为零填充。
在 Linux 中,您可能正在编译为 64 位,访问超过 2GB 的虚拟进程空间。由于您没有接触内存,因此它没有被映射,同样的情况似乎也发生在 calloc
的情况下。 C 运行时不同(Linux 上为 64 位 glibc
,Windows 上为 32 位 Microsoft 库)。您应该在 Linux 的不同终端中使用 top
或 ps
来检查在这两种情况下实际映射到您的进程的内存量。
关于c - 分配和分配 : different memory size allocated,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34023336/
ValueError Traceback (most recent call last) in 23 out
在 CSS 中,我从来没有真正理解为什么会发生这种情况,但每当我为某物分配 margin-top:50% 时,该元素就会被推到页面底部,几乎完全消失这一页。我假设 50% 时,该元素将位于页面的中间位
我正在尝试在 pyTorch 中训练我的第一个神经网络(我不是程序员,只是一个困惑的化学家)。 网络本身应该采用 1064 个元素向量并用 float 对它们进行评级。 到目前为止,我遇到了各种各样的
我有一个简单的问题。如何在 3 个维度上移动线性阵列?这似乎太有效了,但在 X 和 Y 轴上我遇到了索引问题。我想这样做的原因很简单。我想创建一个带有 block 缓冲区的体积地形,所以我只需要在视口
我正在尝试运行我购买的一本关于 Pytorch 强化学习的书中的代码。 代码应该按照本书工作,但对我来说,模型没有收敛,奖励仍然为负。它还会收到以下用户警告: /home/user/.local/li
我目前正在使用 this repo使用我自己的数据集执行 NLP 并了解有关 CNN 的更多信息,但我一直遇到有关形状不匹配的错误: ValueError: Target size (torch.Si
UIScrollView 以编程方式设置,请不要使用 .xib 文件发布答案。 我的 UIScrollView 位于我的模型类中,所以我希望代码能够轻松导入到另一个项目中,例如。适用于 iPad 或旋
我在我的 Ruby on Rails 应用程序(版本 4.3.1)中使用 Bootstrap gem。我最近发现了响应式字体大小功能 (rfs)。根据 Bootstrap 文档,它刚刚在 4.3 版中
这个问题不太可能帮助任何 future 的访客;它仅与一个小地理区域、一个特定时刻或一个非常狭窄的情况相关,而这些情况通常不适用于互联网的全局受众。如需帮助使这个问题更广泛地适用,visit the
size 之间的语义区别是什么?和 sizeIs ?例如, List(1,2,3).sizeIs > 1 // true List(1,2,3).size > 1 // true Luis 在 c
我想从 div 中删除一些元素属性。我的 div 是自动生成的。我想遍历每个 div 和子 div,并想删除所有 font-size (font-size: Xpx)和 size里面font tag
super ,对 Python 和一般编程 super 新手。我有一个问题应该很简单。我正在使用一本使用 Python 3.1 版的 python 初学者编程书。 我目前正在写书中的一个程序,我正在学
我无法从 NativeBase 更改缩略图的默认大小。我可以显示默认圆圈,即小圆圈和大圆圈,但我想显示比默认大小更大的圆圈。这是我的缩略图代码: Prop 大小不起作用,缩略图仍然很小。 我的 Na
我是pytorch的新手。在玩张量时,我观察到了两种类型的张量- tensor(58) tensor([57.3895]) 我打印了它们的形状,输出分别是 - torch.Size([]) torch
这是我的 docker images 命令的输出: $ docker images REPOSITORY TAG IMAGE ID CREATED
来自 PriorityQueue 的代码: private E removeAt(int i) { assert i >= 0 && i < size; modCount++;
首先,在我的系统上保留以下内容:sizeof(char) == 1 和 sizeof(char*) == 4。很简单,当我们计算下面类的总大小时: class SampleClass { char c
我正在编写一个游戏来查找 2 个图像之间的差异。我创建了 CCSprite 的子类 Spot。首先我尝试创建小图像并根据其位置添加自身,但后来我发现位置很难确定,因为很难避免 1 或 2 个像素的偏移
我有一个 Tumblr Site每个帖子的宽度由标签决定。 如果一篇文章被标记为 #width200,CSS 类 .width200 被分配。 问题是,虽然帖子的宽度不同,但它们都使用主题运算符加载相
这个问题在这里已经有了答案: What is the ideal growth rate for a dynamically allocated array? (12 个答案) 关闭 8 年前。 我
我是一名优秀的程序员,十分优秀!