Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++

C++の共用体とは?構造体との違いや使用方法について

投稿日:2021年9月6日 更新日:

 

<目次>

(1) C++の共用体とは?構造体との違いや使用方法について
 (1-1) 共用体とは?構造体との違いは?
 (1-2) 共用体の定義方法、変数定義方法、初期化方法
 (1-3) 共用体のサンプル

(1) C++の共用体とは?構造体との違いや使用方法について

(1-1) 共用体とは?構造体との違いは?

「共用体」は構造体と同様にユーザ定義のデータ型ですが、大きな違いとして「全てのメンバは同じメモリ領域を保持する」という特徴があります。
 
例えば、構造体の場合は次のようなchar、float、doubleのデータがあった際は、各データに対してメモリが確報され、結果的にはchar(1バイト)、float(4バイト)、double(8バイト)の合計13バイトが確保されます。
 
(図111)構造体のメモリ確保のされ方

一方で、共用体の場合は各データのメモリは共有のため、各メンバの中で最も大きなのメンバのサイズに合わせてメモリが確保されます。この例では、char(1バイト)、float(4バイト)、double(8バイト)の中で最も大きなdoubleの8バイトに合わせて8バイト確保します。
 
(図112)共用体のメモリの確保のされ方

なので、同時に複数のメンバを利用する事ができず、メンバのうちの何れか1つのみが有効化された状態になるイメージです。例えば、次節で例をご紹介しますが、double型のメンバを3つ(a,b,c)定義した場合、どれか1つを書き換えると、残りの2つも同じ値に書き変わってしまいます。
 

(1-2) 共用体の定義方法、変数定義方法、初期化方法

キーワードがstruct⇒unionに変わる以外は、基本的な定義方法は構造体の時(⇒★構造体の記事)と殆ど同じです。
 
(構文)
union 共用体名{
    メンバ1;
    メンバ2;
    メンバ3;
    .
    .
    メンバN;
} オブジェクト名;
 
(参考)
・構造体の定義方法
・構造体の変数を定義する方法
・構造体のメンバの初期化方法
 

(1-3) 共用体のサンプル

先ほど「共用体はメモリをシェアしており、どれか1つを書き換えると他も書き変わる」と書きましたが、実際にその様子を見てみます。

●サンプル1:メンバが同一のデータ型

メンバ変数が同一のデータ型(double)の例です。a,b,cのそれぞれに値を代入すると、他の2つも連動して変化しています(同一メモリアドレスなので、1つ書き換える=全部書き換わる)。

#include <iostream>
#include <string>
using namespace std;

int main()
{
    //# 共用体の定義
    union sample {

        //# 初期化方法①
        //# C++では共用体定義の中で初期化可能
        double a;
        double b;
        double c;
    };

    union sample p1;
    p1.a = 1;
    cout << "================" << endl;
    cout << "a= " << p1.a << endl;
    cout << "b= " << p1.b << endl;
    cout << "c= " << p1.c << endl;
    p1.b = 3.14;
    cout << "================" << endl;
    cout << "a= " << p1.a << endl;
    cout << "b= " << p1.b << endl;
    cout << "c= " << p1.c << endl;
    p1.c = 10.2;
    cout << "================" << endl;
    cout << "a= " << p1.a << endl;
    cout << "b= " << p1.b << endl;
    cout << "c= " << p1.c << endl;

}

(結果例)
a,b,cのいずれかを書き換えると、全ての値が書き換わる様子が確認できます。

================
a= 1
b= 1
c= 1
================
a= 3.14
b= 3.14
c= 3.14
================
a= 10.2
b= 10.2
c= 10.2

(図131)

●サンプル2:メンバが異なるデータ型

メンバ変数が異なるデータ型(int, char)の例です。a(int型)に値を代入すると、b(char)も連動して変化しています。int型の「65」は文字「A」のASCIIコードであるため、char型としては「A」と表示されています。
 
(サンプル)
 

Adsense審査用広告コード


Adsense審査用広告コード


-C++

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Valgrindの使い方や見方について(基礎編)

  <目次> (1) Valgrindの使い方や見方について(基礎編)  (1-1) メモリリークのチェックのやり方  (1-2) 「valgrind」コマンドの基本的な使い方  (1-3) …

C++のtime関数やtime_t型の使い方について

  <目次> (1) C++のtime関数やtime_t型の使い方について  (1-1) C++のtime関数とtime_t型とは?  (1-2) C++のtime_t関数のサンプル (1) …

C++の「::」の記載の意味について

  <目次> (1) C++の「::」の記載の意味について  (1-1) 「::」の意味は?  (1-2) サンプル①:スコープ演算子「::」を使ってグローバル変数にアクセス  (1-3) …

ポインタと参照の違いについてサンプルPGを使ってご紹介

  <目次> (1) ポインタと参照の違いについてサンプルPGを使ってご紹介  (1-1) ポインタと参照の概要  (1-2) 両者の違い①:宣言/初期化  (1-3) 両者の違い②:再代入 …

C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点

  <目次> (1) C++のlocaltime関数がスレッドアンセーフである理由と使用上の注意点  (1-1) localtime関数がスレッドアンセーフである理由  (1-2) loca …

  • English (United States)
  • 日本語
Top