|
#include <stddef.h>定義は後述。
#include <cstddef>定義は後述。
namespace std {
typedef 処理系依存 size_t;
}
17.4.3.1.4 型 Tを標準Cライブラリ内の型とするとき, ::T及びstd::Tは, 処理系用に予約する。::Tが定義されている場合, std::Tと同一とする。簡単には、C++では、::size_tとしてもstd::size_tとしても使えるということである。同様の例には、ptrdiff_t、FILEといったものもある。
#define __SIZE_TYPE__ long unsigned int様々な環境に対応できるよう大量の#ifndefの中に埋もれているが、特に特殊な定義がない場合、x86の64ビットでは間接的にlong unsigned intつまりunsigned longで定義されている。
typedef __SIZE_TYPE__ size_t;
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で間接的に定義されるようになっている。#inlude <linux/types.h>
include/linux/types.h では次のように定義される。typedef __kernel_size_t size_t;
__kernel_size_tの定義は環境ごとに様々であるが、代表的な環境(x86とARM)では次のようになっている。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で定義されている。その目的から、概ねアドレス長程度の長さが定義されると思われる。