2

動的に割り当てられた複数回呼び出されたデータが、コードで直接指定されたものやmalloc.

例として、C で次の 2 つのコードを作成しました。

test1.c: int x が割り当てられますmalloc

int main (void)
{
    int *x;
    int i, n=1048576; //n=1024*1024;

    printf("size = %lu\n", n* sizeof(int));

    for(i=0; i<n; i++)
    {
        x = malloc(sizeof(int));
        *x=i;
    }
    printf("Look at top and then press something to finish.");fflush(stdout);
    getc(stdin);
    return 0;
}

簡単にするために、ここではfreeを使用しませんでした。プログラムが対話を待機しているときに、別の端末で一番上の関数を見ると、次のように表示されます。

PID  USER   PR  NI  VIRT   RES    SHR  S  %CPU %MEM  TIME+   COMMAND                                    
1384 root   20  0   41300  34076  1300 S  0.0  3.3   0:00.47 test1

test2.c: int x が動的に割り当てられていません

int main (void)
{
    int x[1048576]; //x[1024*1024]
    int i, n=1048576;

    printf("size = %lu\n", n* sizeof(int));

    for(i=0; i<n; i++)
    {
        x[i]=i;
    }
    printf("Look at top and then press something to finish.");fflush(stdout);
    getc(stdin);
    return 0;
}

そしてトップは私を示しています:

PID  USER   PR  NI  VIRT    RES    SHR  S  %CPU %MEM  TIME+   COMMAND                                    
1352 root   20  0   12404   5500   1304 S  0.0  0.5   0:00.05 test2 

また、使用した test2 と同じ結果になる 3 番目のコードも実行しました。

x = malloc(n*sizeof(int));
for(i=0; i<n; i++)
    {
        x[i]=i;
    }

プロセスのメモリ使用量に大きな違いがあるのはなぜですか? これは、malloc が新しいメモリ ページを要求し、メモリが無駄になっているためですか? またはmalloc、より多くのメモリを割り当てますか?

test1 は合計メモリの3.3%を使用し、 test2 は0.5%を使用します。

環境:

Docker 内の Centos 5 64 ビットでこれらのテストを実行しています。

仮想環境のメモリ:

$ free -m
              total        used        free      shared  buff/cache   available
Mem:            995          98         845           3          51         808
Swap:          1162         194         967
4

2 に答える 2