首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算objective-c/c中动态堆分配的大小?

如何计算objective-c/c中动态堆分配的大小?
EN

Stack Overflow用户
提问于 2013-10-09 21:37:44
回答 1查看 542关注 0票数 0

我想用Objective-C/C代码获得堆分配的大小(live)。正如我们可以在XCode工具中看到的那样。我们如何通过代码获取这些信息?

我想要我的应用程序正在分配的堆中当前活动对象的大小..?我有常驻内存设置信息,但这并不是全部帮助。

EN

回答 1

Stack Overflow用户

发布于 2013-10-09 22:00:36

对于Linux,您可以使用endsbrk(0)之间的差异来确定堆的当前大小:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

extern char etext, edata, end;

int
main(int argc, char *argv[])
{
    printf("First address past:\n");
    printf("    program text (etext)      %10p\n", &etext);
    printf("    initialized data (edata)  %10p\n", &edata);
    printf("    uninitialized data (end)  %10p\n", &end);

    printf("    Heap Size (sbrk() - end)  %10p\n", sbrk(0) - (void *)&end);

   exit(EXIT_SUCCESS);
}

这之所以有效,是因为在Linux中,堆直接在BSS段之后启动。

编辑:

如果您正在查找驻留集(我们的进程当前使用的物理内存量),那么对于Linux,您需要从/proc/self/stat读取它(遗憾的是,getrusage中的字段已停止使用):

代码语言:javascript
复制
FILE *fpstat = fopen("/proc/self/stat", "r");
long int rss;
fscanf(fpstat, "%*d %*s %*c %*d %*d %*d %*d %*d %*u %*u %*u %*u %*u %l*u"
            "%l*u %l*d %l*d %*d %*d %*d %*d %*u %l*u %ld", &rss);
rss *= sysconf(_SC_PAGE_SIZE); // to get memory in bytes

对于OS X,有一个原生的Mach方法:

代码语言:javascript
复制
struct task_basic_info t_info;
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;

task_info(MACH_PORT_NULL, TASK_BASIC_INFO, (task_info_t)&t_info, &t_info_count);
size_t rss = t_info.resident_size;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19273705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档