C++強化し/標準ライブラリ編/<cstddef>の章

編集

はじめに

編集

<cstddef>ヘッダーは、C++プログラミングで使用される基本的な型や値を定義しています。このヘッダーは、元々C標準ライブラリの<stddef.h>ヘッダーに由来しており、C++ではユーティリティライブラリの一部として組み込まれています。主な役割は、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ではバイト型と関連する演算子・関数が追加されました。このヘッダーは低レベルでのプログラミングに欠かせない定義を提供しています。