2013-10-09 32 views

回答

0

對於Linux,你可以使用來自end的差異sbrk(0)以確定您的堆的當前大小:

#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領域是停產):

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存在用於此天然馬赫方法:

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

由於爲答案。其實我想讓我的整個應用程序分配大小。我問一些全球性的東西,應用/程序的當前分配大小是多少?有什麼辦法嗎? –

+0

@C_X我很抱歉,但你的問題被錯誤地詢問,有更多的進程內存,然後就是堆。在這種情況下,您正在尋找駐留集而不是堆:對於Linux,請參閱'/ proc/self/stat'中的字段24,並將其乘以'sysconf(_SC_PAGESIZE)'。對於OS X,task_info將直接爲您查詢RSS。 –

+0

感謝您的回覆。不,我不想那樣,我有這些東西,但駐地記憶並沒有給我什麼,我堆分配。實際上居民的記憶遠遠超過你的現場分配。我很抱歉如果我不能讓這更容易解釋。 –