C++強化し/標準ライブラリ編/<cstddef>の章
編集はじめに
編集<cstddef>
ヘッダーは、C++プログラミングで使用される基本的な型や値を定義しています。このヘッダーは、元々C標準ライブラリの<stddef.h>
ヘッダーに由来しており、C++ではユーティリティライブラリの一部として組み込まれています。主な役割は、NULLポインタ定数、オフセット計算マクロ、サイズ型や相対ポインタ型の定義などです。
マクロ
編集NULL
編集NULL
マクロは、実装定義のnullポインタ定数を表します。ヘッダーファイル内で以下のように定義されています。
#define NULL 実装定義の値
nullポインタ定数は、ポインタ値がゼロであることを表す特別な値です。
offsetof
編集offsetof
マクロは、構造体の最初のバイトからメンバまでのバイトオフセットを取得するために使用します。
#define offsetof(type, member) 実装定義の式
引数type
は構造体の型、member
はその構造体のメンバ変数名です。このマクロは、メンバのアドレスから構造体の先頭アドレスを引くことで、メンバへのオフセットを計算します。
型
編集size_t
編集size_t
は、sizeof
演算子が返す値の型です。つまり、オブジェクトのサイズを表す符号なし整数型です。size_t
型はヘッダーファイル内で以下のように定義されています。
typedef 実装定義の型 size_t;
ptrdiff_t
編集ptrdiff_t
は、ポインタの差を取った際に返される符号付き整数型です。ヘッダーファイル内では次のように定義されています。
typedef 実装定義の型 ptrdiff_t;
ポインタの減算結果がこの型に変換されます。
nullptr_t (C++11)
編集nullptr_t
は、nullポインタリテラルnullptr
の型です。C++11で導入されたこの型は、以下のように定義されています。
typedef decltype(nullptr) nullptr_t;
max_align_t (C++11)
編集max_align_t
は、他のあらゆるスカラ型と同等のアライメント要件を持つ多価型です。つまり、この型のオブジェクトは、プログラムで使用可能な最大のアライメントを要求します。C++11で導入されたこの型は、以下のように定義されています。
typedef 実装定義の型 max_align_t;
新しい型と関数 (C++17)
編集byte (C++17)
編集byte
は、C++17で導入された新しい列挙型で、バイト型を表します。この型は以下のように定義されています。
enum class byte : unsigned char {};
byte
型の値は、ビット単位の操作に使用できます。
to_integer (C++17)
編集to_integer
は、byte
型の値を整数型に変換する関数テンプレートです。
template<class IntType> constexpr IntType to_integer(byte b) noexcept;
この関数は、byte
型の値をIntType
型に変換して返します。IntType
にはあらゆる整数型が使用可能です。
byte型の演算子
編集C++17で導入されたbyte
型には、ビット演算を行うための特別な演算子がサポートされています。
左シフト演算子 (<<
, <<=
)
編集
template<class IntType> constexpr byte& operator<<=(byte& b, IntType shift) noexcept; template<class IntType> constexpr byte operator<<(byte b, IntType shift) noexcept;
これらの演算子は、byte
値の各ビットを左へシフトします。<<=
は複合代入演算子です。
右シフト演算子 (>>
, >>=
)
編集
template<class IntType> constexpr byte& operator>>=(byte& b, IntType shift) noexcept; template<class IntType> constexpr byte operator>>(byte b, IntType shift) noexcept;
これらの演算子は、byte
値の各ビットを右へシフトします。>>=
は複合代入演算子です。
ビット演算子 (|
, |=
, &
, &=
, ^
, ^=
, ~
)
編集
constexpr byte& operator|=(byte& l, byte r) noexcept; constexpr byte operator|(byte l, byte r) noexcept; constexpr byte& operator&=(byte& l, byte r) noexcept; constexpr byte operator&(byte l, byte r) noexcept; constexpr byte& operator^=(byte& l, byte r) noexcept; constexpr byte operator^(byte l, byte r) noexcept; constexpr byte operator~(byte b) noexcept;
これらの演算子は、byte
値に対して論理和、論理積、排他的論理和、ビット補数の演算を行います。|=
、&=
、^=
は複合代入演算子です。
まとめ
編集<cstddef>
ヘッダーは、C++プログラミングで使用される基本的な型やマクロ、値を定義しています。NULLポインタ定数、オフセット計算マクロ、サイズ型、相対ポインタ型などが主な定義内容です。C++11ではnullptrリテラルの型と最大アライメント型、C++17ではバイト型と関連する演算子・関数が追加されました。このヘッダーは低レベルでのプログラミングに欠かせない定義を提供しています。