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

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

関連記事

C++のfork関数の構文や使い方について

  <目次> (1) C++のfork関数の構文や使い方について  (1-1) fork()関数とは?概要や目的  (1-2) fork()関数の構文  (1-3) fork()関数のサンプ …

C++をLinuxでコンパイルする方法について

  <目次> (1) C++をLinuxでコンパイルする方法について  (1-1) STEP0:【事前準備】ターミナル機能の準備(ターミナル、Teraterm、Putty)  (1-2) S …

C++のunsigned char型とは?概要やsigned charとの違いもご紹介

<目次> (1) C++のunsigned char型とは?概要やsigned charとの違いもご紹介  (1-1) 概要  (1-2) サンプルプログラム①:疎通確認 (1) C++のunsign …

C++のtime関数とlocaltime関数の違いについて

  <目次> (1) C++のtime関数とlocaltime関数の違いについて  (1-1) C++のlocaltime関数の概要とサンプル  (1-2) C++のtime関数の概要とサン …

ValgrindのStill Reachableの意味や実際のサンプルをご紹介

  <目次> (1) ValgrindのStill Reachableの意味や実際のサンプルをご紹介  (1-1) Valgrindの「Still Reachable」はどんな状況?  (1 …

  • English (United States)
  • 日本語
Top