ぷるぷるの雑記

低レイヤーがんばるぞいなブログ. 記事のご利用は自己責任で.

size_t型とは

メモリ系のライブラリやコンテナを使っているとよく見るsize_t型についてまとめました.

検証環境

項目 説明
OS Windows11
MinGW-W64 gcc version 8.1.0

size_t型は処理系依存

そもそもですがsize_t型とstd::size_t型は処理系依存だそうです. 符号なし整数型であることさえ守られていればサイズは処理系が好きに決めて良いそうです.

したがって以下の事柄は検証環境においてはこうだったよという記録になります.

size_t型のtypedef宣言

Cの場合

crtdefs.hというファイルに以下のようなtypedef 宣言があります

// crtdefs.h

#ifndef _SIZE_T_DEFINED
#define _SIZE_T_DEFINED
#undef size_t
#ifdef _WIN64
__MINGW_EXTENSION typedef unsigned __int64 size_t;
#else
typedef unsigned int size_t;
#endif /* _WIN64 */
#endif /* _SIZE_T_DEFINED */

以上からsize_t型は64bit環境ではunsigned __int64 型と同等の型になります.

C++の場合

c++config.hというファイルに以下のようなtypedef宣言があります.

// c++config.h

namespace std
{
  typedef __SIZE_TYPE__    size_t;
  typedef __PTRDIFF_TYPE__ ptrdiff_t;

#if __cplusplus >= 201103L
  typedef decltype(nullptr) nullptr_t;
#endif
}

また、__SIZE_TYPE__はどうやら_mingw_mac.hで以下のように定義されています(macroのmac?).

// _mingw_mac.h

#ifndef __SIZE_TYPE__
#  ifdef _WIN64
#    define __SIZE_TYPE__ long long unsigned int
#  else
#    define __SIZE_TYPE__ long unsigned int
#  endif
#endif

以上からstd::size_t型は64bit環境ではlong long unsigned int 型と同等の型になります.

size_t型の意味

メモリ系のライブラリのインターフェースは確保したいメモリの大きさを引数で受け取ることが殆どです. その際に単なる整数型ではなく データの個数やバイト数 を表すために使われることを明確にするためにtypedef宣言されたのがsize_t型です. 逆に言うと、size_t型で宣言しただけではその変数が データの個数を表すのか、それともバイト数を表しているのかは分かりません. 実際MSのドキュメントを読んでみるとmallocとcallocの引数はいずれもsize_t型として宣言されています.

mallocのプロトタイプ宣言
callocのプロトタイプ宣言

learn.microsoft.com

learn.microsoft.com

データの個数を表すのか、それともバイト数を表しているのかは分からない ことを踏まえると、せめて変数名を工夫してあげるのが良いかと思います. 個数を表す変数はnum、バイト数を表す変数はbytesにするなどが有効と考えられます.