structure
「structure」の意味
「structure」とは、構造や構成、建築物などを意味する英単語である。構造とは、物事が成り立っている要素やパーツがどのように組み合わさっているかを指す。例えば、文章の構造は、序論・本論・結論といったパーツが組み合わさって成り立っている。建築物の場合、構造は建物の骨組みや設計を指す。「structure」の発音・読み方
「structure」のIPA表記は/ˈstrʌktʃər/であり、IPAのカタカナ読みは「ストラクチャー」である。日本人が発音するカタカナ英語では「ストラクチャー」と読む。「structure」の語源
「structure」の語源は、ラテン語の「structura」である。これは「構築、建築、構成」といった意味を持つ言葉で、さらに遡るとラテン語の動詞「struere」(積み重ねる、組み立てる)に由来する。「structure」の類語
「structure」の類語には、framework(フレームワーク)、construction(コンストラクション)、architecture(アーキテクチャー)などがある。frameworkは、構造やシステムの基本的な骨組みを指す。constructionは、建築物や構造物の建設や作成を意味する。architectureは、建築物の設計や構造を指す言葉であり、コンピュータシステムの構造を指す際にも使われる。「structure」に関連する用語・表現
「structure」に関連する用語や表現には、structural(ストラクチュラル)、infrastructure(インフラストラクチャー)、restructure(リストラクチャー)などがある。structuralは、「構造的な」や「構造上の」といった意味を持ち、構造に関連する事柄を表す。infrastructureは、社会や経済の基盤となる施設やシステムを指す。restructureは、組織やシステムの構造を再編成することを意味する。「structure」の例文
1. The structure of the building was designed to withstand earthquakes.(その建物の構造は、地震に耐えるように設計されている。) 2. The company decided to change its management structure.(その会社は経営構造を変更することを決定した。) 3. The structure of the sentence is quite complex.(その文の構造は非常に複雑である。) 4. The bridge has a unique steel structure.(その橋は独特の鋼構造を持っている。) 5. The organizational structure of the company has been simplified.(その会社の組織構造が簡素化された。) 6. The structure of the atom consists of a nucleus and electrons.(原子の構造は、核と電子で構成されている。) 7. The structure of the protein is essential for its function.(タンパク質の構造は、その機能にとって不可欠である。) 8. The structure of the database needs to be optimized.(データベースの構造は最適化される必要がある。) 9. The structure of the argument was difficult to follow.(その議論の構造は、理解しにくかった。) 10. The government plans to invest in infrastructure projects.(政府はインフラストラクチャー事業に投資する計画である。)ストラクチャー
「ストラクチャー」の意味・「ストラクチャー」とは
「ストラクチャー」とは、物事の構成や構造を意味する英語由来の言葉である。主に、組織や建築物、システムなどの構成要素やそれらの関係性を指す。また、抽象的な概念や理論の基本的な枠組みを示す場合もある。「ストラクチャー」の語源
「ストラクチャー」は、ラテン語の「struere」(建てる、組み立てる)に由来し、英語の「structure」が語源である。英語では、物理的な構造や組織的な構成、抽象的な概念や理論の基本的な枠組みなど、幅広い意味で用いられる。「ストラクチャー」に関連する用語・知識
ビジネスにおける「ストラクチャー」とは
ビジネスにおける「ストラクチャー」は、組織の構造や役割分担、業務プロセスなどを指す。効率的な組織運営や業務改善のために、適切なストラクチャーを構築することが求められる。金融における「ストラクチャー」とは
金融における「ストラクチャー」は、金融商品や金融取引の構造を指す。例えば、複雑な金融商品のリスクやリターンの特性を理解するために、そのストラクチャーを分析することが重要である。建築における「ストラクチャー」とは
建築における「ストラクチャー」は、建築物の構造や構成要素を指す。建築物の安全性や耐久性、機能性を確保するために、適切なストラクチャーが設計される。「ストラクチャー」と「デストラクチャー」の違い
「ストラクチャー」は物事の構成や構造を指すのに対して、「デストラクチャー」は、物事を分解し、その構成要素や関係性を再評価することを意味する。デストラクチャーは、特に哲学や文学批評の分野で用いられることが多い。「ストラクチャー」を用いた例文
1. このビルのストラクチャーは、地震に強い設計がされている。 2. 企業の組織ストラクチャーを変更することで、業務効率が向上した。 3. 彼の提案する経済理論のストラクチャーは、独自の視点が盛り込まれている。ストラクチャー【structure】
ストラクチュア【structure】
読み方:すとらくちゅあ
ストラクチャー
構造体 [structure]
構造
構造体
(structure から転送)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2026/03/13 01:55 UTC 版)
|
|
この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。 (2011年11月)
|
構造体(こうぞうたい、英: structure)はプログラミング言語におけるデータ型の一つで、1つもしくは複数の値をまとめて格納できる型。それぞれのメンバー(フィールド)に名前が付いている点、またメンバーの型が異なっていてもよい点が配列と異なる。レコードという名前の類似機能として実装されている言語もある。
C/C++やC#などでstructとしてサポートされているほか、Visual Basic/VBAのユーザー定義型Type[1]や、PascalやAdaのrecord型も構造体に相当する。
クラスベースのオブジェクト指向言語では、抽象データ型としてのクラスが構造体の役割をも内包する。Cの文法を継承した言語ではstructキーワードを含むこともあるが、言語によってその役割や性質は異なる。
- C++の
structは、アクセシビリティの初期値がpublicであることを除いて、classと同等の機能を果たす。メンバー変数だけでなくメンバー関数を持つこともでき、派生型を定義することもできる。 - Javaでは、
structキーワードは存在しない。すべてのユーザー定義型は参照型であり、構造体に相当するデータ構造はclassキーワードを使ってクラスとして実現する必要がある。Java 16ではイミュータブルな「レコードクラス」をサポートする[2][3]。 - Kotlinでは、データを保持するためだけのクラスとして、
data class構文により「データクラス」を定義することができる[4]。データクラスはミュータブル[注釈 1]だが、通常のクラス同様に参照型であることには変わりなく、変数の代入は参照のみのコピーとなる。そのため、すべてのプロパティをコピーした新たなオブジェクトを生成するには、コンパイラの推論によって暗黙的に自動定義されたcopy()関数を使うなどする。サブクラスを定義することはできない。 - C#では、構造体の定義に
structキーワードを使用する[5]。classキーワードにより定義されるクラス[6]は「参照型」である一方、構造体は軽量なオブジェクト型を定義するための「値型」であり、クラスと比較していくつかの制約がある。 - VB.NETでは、構造体の定義に
Structureキーワードを使用する[7]。姉妹言語であるC#の構造体と類似の機能である。 - Swiftでは、構造体の定義に
structキーワードを使用する。C#と同様、classキーワードにより定義されるクラスは参照型である一方、構造体は値型である[8][9]。SwiftのクラスはObjective-Cのクラスに対応する概念であり相互運用できるが、構造体は相互運用することができない。
オブジェクト指向言語でないCなどでオブジェクト指向プログラミングを模倣するために構造体を使うこともある。
C言語の例
下記は単純な例示のため、バッファオーバーフローや整数オーバーフローなどは考慮していないことに注意されたい。
#include <stdio.h>
/* PersonalDataを構造体として定義 */
struct PersonalData
{
/* メンバー変数 (つまり構造体の要素) を名前と年齢とする */
char Name[100];
int Age;
};
/* 上で定義された構造体を使ってみる */
int main(void)
{
struct PersonalData pd; /* 構造体変数の宣言 */
struct PersonalData *ppd; /* 構造体へのポインタ */
scanf("%s", pd.Name); /* 値を入力 */
scanf("%d", &(pd.Age)); /* 値を入力 */
ppd = &pd;
ppd->Age++; /* ポインタの参照先のメンバーにアクセスするにはアロー演算子->を使う。*/
printf("%s-%d\n", pd.Name, pd.Age);
return 0;
}
下記は構造体へのポインタをユーザー定義のオブジェクト型のハンドルとして利用する例である。
/* MyObject.h */
/* 構造体の前方宣言 */
typedef struct MyObject MyObject;
extern MyObject* MyObject_create(void); /* コンストラクタの代替 */
extern void MyObject_destroy(MyObject* obj); /* デストラクタの代替 */
extern void MyObject_setPosition(MyObject* obj, double x, double y);
extern void MyObject_getPosition(const MyObject* obj, double* outX, double* outY);
/* MyObject.c */
#include <stdlib.h>
#include <assert.h>
#include "MyObject.h"
/* 構造体の定義 */
struct MyObject {
double x, y;
};
MyObject* MyObject_create(void) {
return calloc(1, sizeof(MyObject));
}
void MyObject_destroy(MyObject* obj) {
free(obj);
}
void MyObject_setPosition(MyObject* obj, double x, double y) {
assert(obj);
obj->x = x;
obj->y = y;
}
void MyObject_getPosition(const MyObject* obj, double* outX, double* outY) {
assert(obj && outX && outY);
*outX = obj->x;
*outY = obj->y;
}
近代的なAPI設計では、このようにしてC互換のオブジェクト指向インターフェイスを定義することがよくある。例えばOpenCL[10]やVulkan[11]などで類似の手法が実際に利用されている。ヘッダーでは構造体の前方宣言だけをすることにより、構造体の具体的な詳細(定義)はAPIのユーザーからは隠蔽されており、不透明な型 (opaque type) として扱われる(カプセル化)。
この手法を使うことで、C互換のインターフェイスを維持しつつ、API関数の実装をCだけでなくC++や他の言語で記述することもできるようになる。また、オブジェクトの生成・破棄を含むあらゆる操作をAPI関数経由に限定し、オブジェクトハンドルを介した操作のみを提供することで、異なるABI間でも正しくオブジェクトをやりとりすることができるため、C/C++以外の他の言語向けバインディング(ラッパーライブラリ)を記述することも容易になる。
C#の例
C#における構造体は、小規模なデータ構造の定義に適した値型 (value type) である[5]。C#におけるクラスはヒープ割り当てを必要とし、完全な継承機能をサポートする参照型 (reference type) である[6]一方、構造体はヒープ割り当てを必要としない軽量な値型であり、代わりに派生型を定義できないなど、制限されたクラスとして振る舞う。クラスと構造体の使い分けに関しては、ガイドラインが提示されている[12]。
組み込みの軽量な型 (bool, char, int, double, etc.) もまた構造体である。
// int 型の数値リテラルも構造体 (System.Int32) のインスタンスであり、オブジェクトである。
string str = 123.ToString();
structキーワードを使用した、ユーザー定義の構造体の例を下に示す。プロパティやメソッド定義の一部にC# 6.0やC# 7.0で追加された糖衣構文が使用されているが、構造体自体はC# 1.0当初から存在する言語機能である。なお、C#の構造体は引数付きコンストラクタをユーザー定義することはできるが、引数のないコンストラクタ(デフォルトコンストラクタ)をユーザー定義することはできない。また、フィールドやプロパティを宣言時初期化することもできない。引数のないコンストラクタでは、各フィールドはその型の既定値で初期化される。C# 10.0以降の構造体は、引数のないコンストラクタをユーザー定義することもできるようになった[13]。
using System;
public struct MutablePoint {
/// <summary>カプセル化されたフィールド。</summary>
private int _x, _y;
/// <summary>X座標を取得・設定するプロパティ。</summary>
public int X {
get => _x;
set => _x = value;
}
/// <summary>Y座標を取得・設定するプロパティ。</summary>
public int Y {
get => _y;
set => _y = value;
}
/// <summary>原点からの距離を取得するプロパティ。</summary>
public double Distance => Math.Sqrt((double)_x * (double)_x + (double)_y * (double)_y);
/// <summary>引数付きコンストラクタ。</summary>
public MutablePoint(int x, int y) {
_x = x;
_y = y;
}
/// <summary>System.ValueTypeのToString()メソッドをオーバーライド。</summary>
public override string ToString() => $"({_x}, {_y})";
}
class Test {
// フィールドで定義された構造体内の全てのフィールドはデフォルト値0で初期化されている。
static MutablePoint s_point;
static void Main() {
Console.WriteLine(s_point.ToString()); // (0, 0) が表示される。
// デフォルトコンストラクタ呼び出し。
var zeroPoint = new MutablePoint();
Console.WriteLine(zeroPoint.ToString()); // (0, 0) が表示される。
// 引数付きコンストラクタ呼び出し。
var point = new MutablePoint(5, 11);
Console.WriteLine(TranslatePoint(point, 1, -9).ToString()); // (6, 2) が表示される。
Console.WriteLine(point.ToString()); // (5, 11) が表示される。
TranslatePoint(ref point, -2, 3);
Console.WriteLine(point.ToString()); // (3, 14) が表示される。
Console.WriteLine("Press any...");
Console.ReadKey(true);
}
// 構造体型 (値型) は、仮引数に値のコピーが渡されるため、
// メソッド内での仮引数の操作によって呼び出し元の実引数の値が変更されることはない。
// 引数がrefパラメータならば、
// あるいはMutablePoint型がstructではなくclassで宣言されていたならば、
// 仮引数の状態の変更は実引数の状態に影響する。
static MutablePoint TranslatePoint(MutablePoint p, int dx, int dy) {
p.X += dx;
p.Y += dy;
return p;
}
static void TranslatePoint(ref MutablePoint p, int dx, int dy) {
p.X += dx;
p.Y += dy;
}
}
C#のデータ型も参照のこと。
C#の構造体は属性によってメモリレイアウトを明示的に指定することができるため、C/C++の構造体との相互運用に便利である。Windows APIなどで定義されている構造体と互換性のある型をC#の構造体によってユーザー定義することで、P/Invokeに利用できる。
VB.NETやF#といった.NET言語も、構文は異なるがC#と同様の構造体を備えている[7][14]。
C++/CLIでは、value structまたはvalue classによって.NETの構造体型を定義することができる[15]。
アライメント
構造体のメンバーのメモリレイアウトは、必ずしも連続しているとは限らない。実行環境(プロセッサアーキテクチャ)に合わせてアクセス効率が最適になるよう、コンパイラによってバイト境界に応じた無名の詰め物(パディング)が挿入されることがある。このパディングはシリアライズや相互運用などで問題になることがあるため、フィールド属性やコンパイラ特有のディレクティブによってアライメントを明示的に調整できる言語や処理系も存在する[16][17]。ただし、アライメントされていないアドレスに構造体メンバーが配置された場合、メンバーアクセスがバスエラーを引き起こすケースもある。
脚注
注釈
- ^ データクラスのすべてのプロパティを
valで宣言することで、イミュータブルにすることもできる。
出典
- ^ User-defined data type (VBA) | Microsoft Docs
- ^ レコード・クラス | Oracle Java SE 16 Help Center
- ^ Java 16の最新情報 | InfoQ
- ^ データクラス - Kotlin Programming Language
- ^ a b 構造体型 - C# リファレンス | Microsoft Docs
- ^ a b クラス - C# プログラミング ガイド | Microsoft Docs
- ^ a b Structure ステートメント - Visual Basic | Microsoft Docs
- ^ 構造体とクラス(Structures and Classes) · The Swift Programming Language日本語版
- ^ Structures and Classes — The Swift Programming Language (Swift 5.6)
- ^ OpenCL-Headers/cl.h at master · KhronosGroup/OpenCL-Headers
- ^ Vulkan-Headers/vulkan_core.h at master · KhronosGroup/Vulkan-Headers
- ^ Choosing Between Class and Struct - Framework Design Guidelines | Microsoft Docs
- ^ Parameterless struct constructors - C# 10.0 draft specifications | Microsoft Learn
- ^ Structures - F# | Microsoft Docs
- ^ ref class and ref struct (C++/CLI and C++/CX) | Microsoft Docs
- ^ StructLayoutAttribute Class (System.Runtime.InteropServices) | Microsoft Docs
- ^ Storage and Alignment of Structures | Microsoft Docs
関連項目
- structureのページへのリンク