名 前
posix_memalign, aligned_alloc, memalign, valloc, pvalloc − ア ラ イ ン メ ン ト さ れ た メ モ リ ー の 割 り 当 て を 行 う
書 式
#include <stdlib.h>
int
posix_memalign(void **memptr, size_t
alignment, size_t size);
void *aligned_alloc(size_t alignment,
size_t size);
void *valloc(size_t size);
#include <malloc.h>
void
*memalign(size_t alignment, size_t
size);
void *pvalloc(size_t size);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
posix_memalign(): _POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600
aligned_alloc(): _ISOC11_SOURCE
valloc():
glibc 2.12 以 降 :
_BSD_SOURCE ||
(_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED)
&&
!(_POSIX_C_SOURCE >= 200112L ||
_XOPEN_SOURCE >= 600)
glibc 2.12 よ り 前 :
_BSD_SOURCE ||
_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
((非 標 準 の ) ヘ ッ
ダ ー フ ァ イ ル
<malloc.h> も valloc() の
宣 言 も 公 開 す
る 。 機 能 検 査
マ ク ロ は 不 要
で あ る 。
説 明
関 数 posix_memalign() は 、 size バ イ ト の メ モ リ ー を 割 り 当 て 、 割 り 当 て ら れ た メ モ リ ー の ア ド レ ス を *memptr に 設 定 す る 。 割 り 当 て ら れ た メ モ リ ー の ア ド レ ス は alignment の 倍 数 に な っ て い る は ず で あ る 。 alignment は 2 の べ き 乗 で 、 か つ sizeof(void *) の 倍 数 で な け れ ば な ら な い 。 size が 0 の 場 合 、 *memptr に は NULL か 一 意 な ポ イ ン タ ー 値 が 書 か れ る 。 こ の ポ イ ン タ ー 値 は 、 後 で free(3) に 問 題 な く 渡 す こ と が で き る 。 廃 止 さ れ た 関 数 で あ る memalign() は 、 size バ イ ト の メ モ リ ー を 割 り 当 て 、 割 り 当 て ら れ た メ モ リ ー へ の ポ イ ン タ ー を 返 す 。 メ モ リ ー の ア ド レ ス は alignment の 倍 数 に な っ て い る は ず で あ る 。 alignment は 2 の べ き 乗 で な け れ ば な ら な い 。 関 数 aligned_alloc() は memalign() と 同 じ だ が 、 size が alignment の 倍 数 で な け れ ば な ら な い と い う 追 加 の 制 限 が あ る 点 が 異 な る 。 廃 止 さ れ た 関 数 で あ る valloc() は size バ イ ト の メ モ リ ー を 割 り 当 て 、 割 り 当 て ら れ た メ モ リ ー へ の ポ イ ン タ ー を 返 す 。 メ モ リ ー の ア ド レ ス は ペ ー ジ サ イ ズ の 倍 数 に な っ て い る は ず で あ る 。 こ れ は memalign(sysconf(_SC_PAGESIZE),size) と 等 価 で あ る 。 廃 止 さ れ た 関 数 pvalloc() は valloc() と 同 様 だ が 、 割 り 当 て ら れ る サ イ ズ が シ ス テ ム の ペ ー ジ サ イ ズ の 倍 数 に 切 り 上 げ ら れ る 。 こ れ ら の 関 数 は い ず れ も メ モ リ ー の ゼ ロ ク リ ア を 行 わ な い 。
返 り 値
aligned_alloc(), memalign(), valloc(), pvalloc() は 割 り 当 て ら れ た メ モ リ ー へ の ポ イ ン タ ー を 返 す 。 割 り 当 て に 失 敗 し た 場 合 は NULL を 返 す 。
posix_memalign() は 成 功 し た 場 合 は 0 を 返 し 、 失 敗 し た 場 合 は 次 の セ ク シ ョ ン に 記 載 さ れ た エ ラ ー 値 の い ず れ か を 返 す 。 posix_memalign() の 呼 び 出 し 後 は errno の 値 は 不 定 で あ る 。
エ ラ ー
EINVAL |
alignment 引 き 数 が 2 の べ き 乗 で な か っ た か 、 sizeof(void *) の 倍 数 で な か っ た 。 | ||
ENOMEM |
割 り 当 て 要 求 を 満 た す の に 十 分 な メ モ リ ー が な か っ た 。
バ ー ジ ョ ン関 数 memalign(), valloc(), pvalloc() は す べ て の Linux libc ラ イ ブ ラ リ で 使 用 可 能 で あ る 。 関 数 aligned_alloc() は glibc バ ー ジ ョ ン 2.16 で 追 加 さ れ た 。 関 数 posix_fallocate() は glibc 2.1.91 以 降 で 利 用 可 能 で あ る 。 |
準 拠
関 数 valloc() は 3.0BSD で 登 場 し た 。 4.3BSD で は 廃 止 さ れ た と 記 載 さ れ て お り 、 SUSv2 で は 過 去 の 名 残 だ と 記 載 さ れ て い る 。 POSIX.1−2001 に は 存 在 し な い 。 関 数 pvalloc() は GNU に よ る 拡 張 で あ る 。 関 数 memalign() は SunOS 4.1.3 で 登 場 し た が 、 4.4BSD に は な い 。 関 数 posix_memalign() は POSIX.1d に 由 来 す る 。 関 数 aligned_alloc() は C11 標 準 で 規 定 さ れ て い る 。 ヘ ッ ダ ー
posix_memalign() の 宣 言 を <stdlib.h> で 行 う こ と に 関 し て は 、 皆 の 意 見 が 一 致 し て い る 。 い く つ か の シ ス テ ム で は 、 memalign() は <malloc.h> で は な く <stdlib.h> で 宣 言 さ れ て い る 。
SUSv2 に よ る と 、 valloc() は <stdlib.h> で 宣 言 さ れ る 。 libc4,5 や glibc で は <malloc.h> で 宣 言 さ れ て お り 、 さ ら に 適 切 な 機 能 検 査 マ ク ロ が 定 義 さ れ た 場 合 に は <stdlib.h> で も 宣 言 さ れ る (上 記 を 参 照 )。
注 意
多 く の シ ス テ ム で は 、 ア ラ イ ン メ ン ト に 関 し て 制 限 が あ る 。 例 え ば 、 ブ ロ ッ ク デ バ イ ス に 対 す る ダ イ レ ク ト I/O に 使 用 す る バ ッ フ ァ ー に は ア ラ イ ン メ ン ト に 関 す る 制 限 が あ る 。 POSIX で は 、 ど ん な ア ラ イ ン メ ン ト が 必 要 か を 知 る た め に pathconf(path,_PC_REC_XFER_ALIGN) コ ー ル を 規 定 し て い る 。 こ こ で posix_memalign() を 使 う と 、 こ の 必 要 条 件 を 満 た す こ と が で き る 。
posix_memalign() は alignment が 上 で 詳 細 に 述 べ た 必 要 条 件 を 満 た す か ど う か を 確 か め る 。 memalign() は alignment 引 き 数 が 正 し い か ど う か の 確 認 を 行 わ な い か も し れ な い 。
POSIX で は posix_memalign() に よ っ て 獲 得 し た メ モ リ ー は free(3) を 使 っ て 解 放 す る こ と が で き る 必 要 が あ る 。 い く つ か の シ ス テ ム で は memalign() や valloc() で 割 り 当 て ら れ た メ モ リ ー を 再 利 用 す る 手 段 が 提 供 さ れ て い な い (な ぜ な ら free(3) に 渡 す こ と が で き る の は malloc(3) か ら 受 け 取 っ た ポ イ ン タ ー だ け だ が 、 例 え ば memalign() は malloc(3) を 呼 び 出 し 、 得 た 値 を ア ラ イ ン メ ン ト し て し ま う か ら で あ る )。 glibc の 実 装 で は 、 こ こ に 述 べ た 関 数 の い ず れ で 獲 得 し た メ モ リ ー も free(3) で 再 利 用 す る こ と が で き る 。
glibc の malloc(3) は 常 に 8 バ イ ト に ア ラ イ ン メ ン ト さ れ た メ モ リ ー ア ド レ ス を 返 す の で 、 こ こ で 述 べ た 関 数 が 必 要 に な る の は 8 バ イ ト よ り も 大 き な ア ラ イ ン メ ン ト が 必 要 な 場 合 だ け で あ る 。
関 連 項 目
brk(2), getpagesize(2), free(3), malloc(3)
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。