メモリ系のライブラリやコンテナを使っているとよく見る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型として宣言されています.
データの個数を表すのか、それともバイト数を表しているのかは分からない ことを踏まえると、せめて変数名を工夫してあげるのが良いかと思います. 個数を表す変数はnum、バイト数を表す変数はbytesにするなどが有効と考えられます.