MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C++の基礎 - 構造体のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C++の基礎 - 構造体
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == 構造体は、異なるデータ型の要素をグループ化するためのユーザ定義データ型である。<br> これにより、関連するデータを1つの単位として扱うことができる。<br> <br> C++における構造体の特徴として、以下に示すものが挙げられる。<br> C言語とは異なることに注意する。<br> * メンバアクセス *: メンバには、<code>.</code>演算子でアクセスする。 *: 構造体へのポインタを使用する場合、<code>-></code>演算子でメンバにアクセスする。 * デフォルトはpublic *: クラスと異なり、構造体のメンバはデフォルトで<code>public</code>である。 * 継承可能 *: 構造体は他の構造体やクラスを継承することができる。 <br><br> == 構文 == <syntaxhighlight lang="c++"> struct <構造体名> { データ型1 メンバ1; データ型2 メンバ2; // ... }; </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // 例: struct Person { std::string name; int age; double height; }; int main() { Person p1; p1.name = "田中太郎"; p1.age = 30; p1.height = 175.5; } </syntaxhighlight> <br><br> == 使用例 == <syntaxhighlight lang="c++"> </syntaxhighlight> <br><br> == 構造体ポインタ == 構造体へのポインタを使用する場合、<code>-></code>演算子でメンバにアクセスする。<br> <syntaxhighlight lang="c++"> Person* pPtr = &p1; pPtr->name = "鈴木花子"; </syntaxhighlight> <br><br> == 構造体の配列 == 構造体の配列を作成して、複数のデータセットを管理することができる。<br> <syntaxhighlight lang="c++"> Person people[3] = { {"山田一郎", 25, 170.0}, {"佐藤二郎", 35, 180.0}, {"高橋三郎", 45, 165.5} }; </syntaxhighlight> <br><br> == メソッド == C++では、構造体内にメソッドを定義することもできる。<br> <syntaxhighlight lang="c++"> struct Rectangle { double width; double height; double area() { return width * height; } }; </syntaxhighlight> <br><br> == 構造体のアライメント == 以下に示す方法により、構造体のアライメントを制御することができる。<br> <br> <u>※注意 1</u><br> <u>Clangは、以下に示す全ての方法をサポートしている。</u><br> <u>ただし、特定のターゲットプラットフォームやClangのバージョンにより、サポートされる機能や動作が若干異なる可能性があることに注意する。</u><br> <br> <u>※注意 2</u><br> * アライメントの変更は、プラットフォーム依存の問題を引き起こす可能性がある。 * 一部のCPUアーキテクチャでは、アライメントされていないメモリアクセスがパフォーマンスの低下やクラッシュを引き起こす可能性がある。 * クロスプラットフォーム開発を行う場合は、異なるコンパイラやプラットフォームでの動作を確認する必要がある。 <br> アライメントの変更が必要かどうかを検討して、可能な限り標準的なアライメントを使用することを推奨する。<br> <br> ==== GNU C/C++の属性を使用する方法 ==== GCC / Clangで動作する。<br> <syntaxhighlight lang="c++"> struct __attribute__((packed)) MyStruct { // 構造体のメンバ }; </syntaxhighlight> <br> ==== プラグマを使用する方法 ==== GCC / Clangで動作する。<br> <syntaxhighlight lang="c++"> #pragma pack(push, 1) struct MyStruct { // 構造体のメンバ }; #pragma pack(pop) </syntaxhighlight> <br> ==== Clang特有の属性を使用する方法 ==== Clangのみ動作する。<br> <syntaxhighlight lang="c++"> struct [[gnu::packed]] MyStruct { // 構造体のメンバ }; </syntaxhighlight> <br> ==== C++11以降の標準属性を使用する方法 ==== GCC / Clangで動作する。<br> <syntaxhighlight lang="c++"> struct alignas(1) MyStruct { // 構造体のメンバ }; </syntaxhighlight> <br> <u>※注意</u><br> * <code>__attribute__((packed))</code> や <code>#pragma pack(1)</code> を使用する場合、構造体全体が1バイトアライメントになる。 * <code>alignas(1)</code> を使用する場合、構造体全体のアライメントは1バイトになるが、個々のメンバは自然なアライメントを保持する。<br>完全に詰めたパッキングが必要な場合は、<code>__attribute__((packed))</code> や <code>#pragma pack(1)</code> の方が適している。 * クロスプラットフォーム開発を行う場合は、異なるコンパイラやプラットフォームでの互換性を確認することが重要である。 * アライメントの変更は、特に必要な場合にのみ行うべきである。<br>不適切なアライメントは、パフォーマンスの低下や一部のアーキテクチャでは問題を引き起こす可能性がある。 <br><br> == Linux固有の情報 == Linuxシステムにおいて、多くのシステムコールやライブラリ関数は構造体を使用してデータを受け渡しする。<br> 例えば、struct statはファイル情報を格納するために使用される。<br> <syntaxhighlight lang="c++"> #include <sys/stat.h> struct stat file_info; if (stat("example.txt", &file_info) == 0) { // file_infoを使ってファイル情報にアクセス } </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:C++]]
C++の基礎 - 構造体
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse