- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
做一些分析(内存和速度) 我一直被 win7 似乎分配的 RAM 正好是我要求的两倍这一事实所困扰...注意这是我第一次在 win7 上进行这样的主动分析,所以我真的不知道会发生什么。
我在 win7(64 位)下使用 MSVC 快速版循环分配精确数量的 RAM。该应用程序以 32 位编译和运行。
我分配了 24 MB 的内存,任务管理器显示我的应用程序使用了 48MB(在所有内存列下,包括已提交,因为我实际上是在新区域中进行内存复制)。当我再得到 24 个(现在应该是 48MB)时,我的应用跳转到 96,等等。
这些被分配为 1,000,000 个 24 字节结构。
我在网上搜索过,但没有找到与我的观察结果完全相符的东西。
有人知道吗?
如果这只是操作系统的诡计(或无能?),是否有任何工具可以提供进程的实际内存消耗? (很难找到漏洞,当应用程序开始涌现时 ;-)
[------------ 已编辑,附加信息------------]
注意(通过控制台标题栏中的路径)我正在 Release模式下构建(使用 MSVC 2010 的所有默认“空”项目设置),因此没有分配额外的“调试”内存(可以是在某些项目上相当广泛)。
这是一个简短、完整的 C 应用程序,它说明了行为:
#include
#include
#include
#include
typedef unsigned int u32;
typedef struct myStruct MYS;
struct myStruct {
u32 type;
union {
u32 value;
char * str;
void * data;
MYS ** block;
MYS * plug;
};
u32 state, msg, count, index;
};
int main(int argc, char *argv[]){
int i, j;
MYS *ref;
printf ("size of myStruct: %d\n\n", sizeof(MYS));
for(i=0; i < 10; i ++){
printf("allocating started...\n");
for (j = 0; j < 1000000 ; j ++){
ref = (MYS *) malloc(sizeof(MYS));
assert(ref);
memset(ref, 0, sizeof(MYS));
}
printf(" Done... Press 'enter' for Next Batch\n");
_getch();
}
_getch();
trả về 0;
}
和一张图片,显示了一个循环后我的机器上的内存。每隔一次运行,它会增加 ~48MB 而不是 24MB!
câu trả lời hay nhất
这可能是由于填充、内部管理结构和内存对齐限制的组合。
当您调用 malloc(size)
时,您实际上并没有获得 kích cỡ
字节的缓冲区。您得到一个Ít nhất kích cỡ
字节的缓冲区。这是因为,出于效率原因,您的操作系统更喜欢只提供几种不同大小的内存缓冲区,而不会调整缓冲区以节省空间。例如,如果您在 Mac OS 上请求 24 字节,您将获得 32 字节的缓冲区(浪费 25%)。
将您的操作系统用于管理 trung tâm
缓冲区的结构(可能占每次分配的几个额外字节)添加到该分配开销,以及填充可能会增加对象大小的事实(到你的编译器首选对齐的倍数),你会发现将数百万个小对象分配到单独的缓冲区中是非常昂贵的。
长话短说:只分配一个 sizeof (YourType) * 1000000
的大缓冲区,您应该看不到任何明显的开销。分配一百万个 sizeof (YourType)
对象,您最终会浪费大量空间。
关于c - 分配 ram 显示任务管理器中 ram 使用量的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6655185/
我希望有人能解释为什么我的应用程序在加载时使用不同数量的 RAM。我说的是直接使用 exe 的编译版本。这是一个非常基本的应用程序,在应用程序的启动中没有条件分支。然而,每次我启动它时,RAM 量都在
我有一个 inode 使用率为 100% 的磁盘驱动器(使用 df -i 命令)。但是在大量删除文件后,使用率仍然是 100%。 那么正确的做法是什么? 磁盘空间使用量较少的磁盘驱动器怎么可能有Ino
假设我与分支有一个智能合约,其中每个分支都有不同数量的操作。 if (someCondition) { // do operations costing 10 gas } else { //d
是否有一种工具可以在提交到 NEAR 网络之前估算合约调用将产生多少 gas? 最佳答案 目前最好的估计是用runtime-standalone ,它可以处理交易而不必担心共识/网络。这意味着您可以创
我正在使用最新的 SDK 开发适用于 Windows Azure 的应用程序。 目前我正在使用缓存实现 session 提供程序,但模拟器完全不成比例: 缓存被实现为“非常小的”辅助角色(最大 768
我正在为我的 Logstash RAM 问题寻找答案,因为它几乎是 100%。我为它做了很多搜索,但他们没有为我工作。下面的代码是我的 logstash.conf 文件。我认为它需要一些小改动。 Lo
我已经阅读了这里有关此问题的所有其他问题以及互联网其他地方的许多文章。根据this site ,最大内存使用量遵循以下公式: Max memory = [-Xmx] + [-XX:MaxPermSiz
我需要以编程方式增加 Android 中的 RAM 使用量,以观察它随时间的变化。我该怎么做? 我尝试生成很多自定义对象,但生成后意外地 RAM 使用量减少了...我更改了对象数量、结构等,但没有任何
我们使用带有 MMFiles 存储引擎的 ArangoDB 3.3.14(社区版)来处理相对较大的数据集(备份时会超过 30 GB)。我们使用 ECS 在 Docker 容器内运行它。我们的主机虚拟机
我收到了 Hostgator 发来的一条说明,表明他们限制了我对 MYSQL 的访问,因为我的网站使用了太多资源。 通常,在这种情况下,我只会恢复备份以查看最近的更改是否会产生错误。但是,除了写了一些
我使用 TMimeMess 来解码基于 SMTP 服务器的传入电子邮件在突触上。 我发现用于解码 50MB MIME 消息(带有附件),TMimeMess 使用了 600-800MB 的内存。 在这里
我正在打包适用于 iOS 和 Android 的 Adobe Air 应用程序,并且我的 (RAM) 内存使用量超过 100MB。我的游戏(RPG)中有大量 Assets 。 Assets 的数量
Tôi là một lập trình viên xuất sắc, rất giỏi!