C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++のsizeof演算子とは?基本的な使い方と実践的な活用例を解説

sizeof演算子は、C言語およびC++で最もよく使われる演算子のひとつです。渡されたデータ型やデータ構造のサイズ(バイト数)を計算するために使用され、符号なし整数型の値を返します。プリミティブ型(基本データ型)はもちろん、複合データ型にも適用できる点が大きな特徴です。

データ型に直接sizeof演算子を適用すれば、その型が占めるメモリサイズを簡単に確認できます。

基本データ型のサイズを確認する

#include <bits/stdc++.h>
using namespace std;

int main() {
    cout << sizeof(int) << "\n";
    cout << sizeof(char) << "\n";
    cout << sizeof(float) << "\n";
    cout << sizeof(long) << "\n";
    return 0;
}

出力結果

4
1
4
8

この機能を利用することで、任意の変数がどれだけのメモリを消費するかを把握できます。なお、出力結果はコンパイラに依存する点に注意が必要です。たとえば、16ビットコンパイラと32ビットコンパイラでは、int型に対して異なる値が返されることがあります。

sizeof演算子を式に適用した場合の挙動

sizeof演算子はコンパイル時に評価されるという重要な特性を持っています。そのため、式に適用しても、その式の実際の値は変化しません。

#include <bits/stdc++.h>
using namespace std;

int main() {
    int x = 10;
    cout << sizeof(x++) << "\n"; // コンパイル時に評価される
    cout << x << "\n";           // xの値は変化しない
    return 0;
}

出力結果

4
10

ご覧のとおり、sizeof演算子はコンパイル時に処理されるため、インクリメント演算(x++)は実行時に行われず、xの値は10のまま変化しません。これはsizeofの重要な特性であり、副作用を伴う式を渡しても安全であることを意味します。

sizeof演算子が必要とされる場面

sizeof演算子にはさまざまな用途がありますが、特に重要なのは、配列・構造体・共用体などの複合データ型のサイズを求めることです。

配列の要素数を求める

#include <bits/stdc++.h>

using namespace std;

int main() {
    int arr[] = {1, 2, 3, 4, 5};          // 対象の配列

    int size = sizeof(arr) / sizeof(int); // 配列の要素数を計算

    cout << size << "\n";                 // 要素数を出力
}

出力結果

5

ここでは、まず配列全体が占めるメモリサイズをsizeof(arr)で取得し、それを要素1つ分のサイズ(sizeof(int))で割ることで、配列の要素数を算出しています。このテクニックは、配列のサイズを明示的に管理せずに済むため、実務でも頻繁に使われます。

動的メモリ確保での活用

もうひとつの重要な用途が動的メモリ確保です。malloc関数などでメモリを割り当てる際、確保すべきバイト数の計算にsizeof演算子が活躍します。

#include <bits/stdc++.h>

using namespace std;

int main() {
    // sizeof(int)は4バイトなので、10個分の40バイトを確保
    int* ptr = (int*)malloc(10 * sizeof(int));
    return 0;
}

この例では、sizeof(int)が4バイトであるため、10個分のint型領域、つまり合計40バイトのメモリが確保されます。ハードコードせずにsizeofを使うことで、環境が変わっても正しく動作する移植性の高いコードになります。

まとめ

この記事では、sizeof演算子の基本的な使い方と仕組みについて解説しました。基本データ型のサイズ確認から、配列の要素数の計算、動的メモリ確保まで、代表的なユースケースのコードを実装し、その出力結果を確認しました。これらのプログラムは、C、Java、Pythonなど他の言語でも同様の考え方で記述できます。sizeof演算子を正しく理解することは、メモリを意識した効率的なプログラミングの第一歩です。本記事が皆さんのお役に立てば幸いです。


  1. C++のsizeof演算子とは?基本構文と使い方を実例付きで解説

    sizeof はC++のキーワードであると同時に、コンパイル時に評価される演算子でもあります。変数やデータ型が必要とするメモリのサイズをバイト単位で取得するために使用され、プログラムの実行時ではなくコンパイルの時点でその値が確定する点が特徴です。sizeof演算子は、int や double などの組み込み型だけでなく、クラス・構造体・共用体などユーザー定義のデータ型に対しても使用できます。sizeofの基本構文sizeof (data type)「data type」の部分には、サイズを調べたいデータ型や変数名を指定します。例えば、char 型のオブジェクトに適用した場合は必ず 1 を返しま

  2. C++の単項演算子とは?種類・使い方を実例付きで解説

    単項演算子(unary operator)とは、1つのオペランド(被演算子)に対して作用し、新しい値を生成する演算子のことです。C++には以下のような単項演算子が用意されています。 C++の主な単項演算子一覧 演算子説明 間接参照演算子(*)ポインタ変数に作用し、そのポインタが指すアドレスにある値に相当するlvalueを返します。この操作はポインタの「デリファレンス(間接参照)」と呼ばれます。 アドレス取得演算子(&)オペランドのメモリアドレスを取得する単項演算子です。オペランドとしては、関数指定子、またはビットフィールドでなく、register記憶クラス指定子を付けずに宣言さ