Linux環境でのアプリケーションプログラミング(2):メモリ割り当て

I.概要

        多くのシステムプログラムは、動的データ構造(リンクリストとバイナリツリー)に追加のメモリを割り当てる必要があります。このようなデータ構造のサイズは、実行時に取得される情報によって決まります。

        プロセスは、ヒープのサイズを増やすことでメモリを割り当てることができます。いわゆるヒープは、プロセスの初期化されていないデータセグメントの最後から始まり、メモリが割り当てられると増減する可変長の連続仮想メモリです。通常、ヒープの現在のメモリが変更されます。境界は「プログラムブレーク」と呼ばれます。

2:ヒープにメモリを割り当てます

1.プログラムブレークを調整します

#include <unistd.h>

int brk(void *addr);

void *sbrk(intptr_t increment);

       ヒープのサイズを変更することは、実際には、プロセスのプログラムブレーク位置を変更するようにカーネルに指示するようなものです。プログラムブレーク位置が上がると、プログラムは、物理メモリページがまだ割り当てられていないときに、新しく割り当てられた領域の任意のメモリアドレスにアクセスできます。プロセスが最初にこれらの仮想メモリアドレスにアクセスしようとすると、カーネルは新しい物理メモリページを自動的に割り当てます。

brk:システムコールは、プログラムブレークをパラメータaddrで指定された位置に設定します。仮想メモリはページ単位で割り当てられるため、addrは実際には次のメモリページ境界に丸められます。addr値が初期値&endよりも低い場合、予期しない動作が発生します。

sbrk:プログラムブレークの元のアドレスのパラメータ増分の着信サイズを増やすと、呼び出しは新しく割り当てられたメモリの開始アドレスへのポインタを正常に返します。

2. malloc()およびfree()

#include <stdlib.h>

void *malloc(size_t size);
void free(void *ptr);

malloc:ヒープ上のパラメータサイズサブセクションのサイズのメモリを割り当て、新しく割り当てられたメモリの開始アドレスへのポインタを返します。割り当てられたメモリは初期化されていません。

free: ptrパラメータはメモリブロックを指します。これは通常、malloc呼び出しの戻り値です。

3. Calloc()およびrealloc()

void *calloc(size_t nmemb, size_t size);
void *realloc(void *ptr, size_t size);

calloc: nmembは割り当てられたオブジェクトの数を指定し、sizeは各オブジェクトのサイズを指定します。戻り値はメモリへのポインタです。割り当てが失敗した場合はNULLを返します。callocによって割り当てられたメモリは0に初期化されています。

realloc:既存のメモリに基づいてメモリのサイズを調整します。

上記の2つのメモリ要求呼び出しは両方ともfree()によって解放されます。

4.整列されたメモリを割り当てます:memalign()およびposix_memalign()

#include <stdlib.h>
int posix_memalign(void **memptr, size_t alignment, size_t size);


#include <malloc.h>
void *memalign(size_t alignment, size_t size);

3:スタックにメモリを割り当てます

#include <alloca.h>

void *alloca(size_t size);

alloca()呼び出しは動的にメモリを割り当てることもできますが、ヒープからメモリを割り当てる代わりに、スタックフレームのサイズを増やすことによってスタックからメモリを割り当てます。無料でリリースすることはできません。スタックフレームが削除されると自動的にリリースされます。

 

おすすめ

転載: blog.csdn.net/qq_34968572/article/details/109508117