ア | イ | ウ | エ | オ |
カ | キ | ク | ケ | コ |
サ | シ | ス | セ | ソ |
タ | チ | ツ | テ | ト |
ナ | ニ | ヌ | ネ | ノ |
ハ | ヒ | フ | ヘ | ホ |
マ | ミ | ム | メ | モ |
ヤ | ユ | ヨ | ||
ラ | リ | ル | レ | ロ |
ワ | ヰ | ヴ | ヱ | ヲ |
ン |
A | B | C | D | E |
F | G | H | I | J |
K | L | M | N | O |
P | Q | R | S | T |
U | V | W | X | Y |
Z | 数字 | 記号 |
C/C++などにおける変数型の一つ。「長さ」を格納するために使われる。Cの場合はANSI C以降で対応する。
#include <stddef.h>
定義は後述。
C99(ISO/IEC 9899:1999)においては、ある変数をsize_t型で宣言するためには次のいずれかの標準ヘッダーを読み込む必要があるとしている。
実際の定義はstddef.hの中にあることが多い(実装による)。他のヘッダーファイルは、間接的にstddef.hをincludeしている。
C++でも、ヘッダーのincludeが必要で、その仕様はCと変わらない。
C++の場合は先頭にcを付けて後尾に.hを付けない、<cstddef>を使用する。両者の違いは名前空間(namespace)である。
理論上は、この何れかをincludeすれば、size_tがtypedefされる。
規格によれば、JIS X 3014「プログラム言語C++」p258には以下のように書かれている。
17.4.3.1.4 型 Tを標準Cライブラリ内の型とするとき, ::T及びstd::Tは, 処理系用に予約する。::Tが定義されている場合, std::Tと同一とする。
簡単には、C++では、::size_tとしてもstd::size_tとしても使えるということである。同様の例には、ptrdiff_t、FILEといったものもある。
数値の型を表わすサフィックスは、特に定義されていない。
ユーザー空間(glibc)の場合、例えばx86の64ビットの場合で、GCC 4.4なら /usr/lib/gcc/x86_64-linux-gnu/4.4/include/stddef.h で定義される。
#define __SIZE_TYPE__ long unsigned int
typedef __SIZE_TYPE__ size_t;
様々な環境に対応できるよう大量の#ifndefの中に埋もれているが、特に特殊な定義がない場合、x86の64ビットでは間接的にlong unsigned intつまりunsigned longで定義されている。
Microsoft WindowsのVisual C++では、次のようになっている。
つまりWin32環境では32ビット長、Win64環境では64ビット長である。
stddef.hなど
typedef __size_t size_t;
32ビットの場合、/usr/include/asm/_types.h など
typedef unsigned int __uint32_t; typedef __uint32_t __size_t;
x86の64ビット(AMD64 ISA/Intel 64)の場合、/usr/include/machine/_types.h など
typedef unsigned long __uint64_t; typedef __uint64_t __size_t;
つまりFreeBSDでは、概ね、32ビット環境ではunsigned int、64ビット環境ではunsigned longで間接的に定義されるようになっている。
Linuxカーネルでは、次のようにして使う。
#inlude <linux/types.h>
include/linux/types.h では次のように定義される。
typedef __kernel_size_t size_t;
__kernel_size_tの定義は環境ごとに様々であるが、代表的な環境(x86とARM)では次のようになっている。
x86の32ビットの場合、arch/x86/include/asm/posix_types_32.h で定義される。
typedef unsigned int __kernel_size_t;
x86の64ビットの場合、arch/x86/include/asm/posix_types_64.h で定義される。
typedef unsigned long __kernel_size_t;
ARMの32ビットの場合、arch/arm/include/asm/posix_types.h で定義される。
typedef unsigned int __kernel_size_t;
概ね、32ビットならunsigned int、64ビットならunsigned longで定義されている。その目的から、概ねアドレス長程度の長さが定義されると思われる。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます