imported>Administrator |
imported>Administrator |
1行目: |
1行目: |
− | '''インスタンス'''([[英語]]:instance)とは、「実体」のことである。
| + | 構造体(struct)とは、一部の[[プログラミング言語]]に搭載されている、複数の既存の型の組み合わせを、新しい型として定義できる機能のことである。 |
| | | |
− | == アプリケーション ==
| + | [[IT土方]]の現場では構造体を「[[固定長]]の[[データ]]」として[[ファイル]]などに読み書きする技法が古くから使われている。[[XML]]や[[JSON]]などという軟弱なフォーマットはあまり使われない。 |
− | [[ROM]]や[[HDD]]の中に格納されている[[アプリ]]([[プログラム]])が[[RAM]]に読み込まれ実行可能な状態になったものを「インスタンス」という。 | |
| | | |
− | 現実的には、上記のように[[プログラム]]が[[RAM]]に読み込まれ、実行が開始され、ある程度の初期化を済ませた状態を指すことが多い。
| + | 構造体のメンバーに[[関数ポインタ]]を入れると、いわゆる[[オブジェクト指向]]の「[[クラス]]」に近いものになる。 |
− | | |
− | この初期化処理の際に「同名のアプリが起動しているか」をチェックして終了するものを「シングルインスタンス」、チェックしないものを「マルチインスタンス」などと呼ぶ。
| |
− | | |
− | === Windows ===
| |
− | [[Windows]]はマルチインスタンスが基本となっている。スタートメニューやタスクバーのアイコンをクリックすると次々と同じアプリが立ち上がる。
| |
− | | |
− | このため多くの[[プログラマー]]が「多重起動防止する方法」を調べるのが定番となっている。
| |
− | | |
− | === AndroidやiOS ===
| |
− | [[Android]]や[[iOS]]はシングルインスタンスが基本となっている。[[スマホ]]という特性上こちらのほうが使い勝手がいいからだ。
| |
− | | |
− | このため多くの[[ゲーマー]]がチートするために「マルチインスタンス化する方法」を調べているようだ。
| |
− | | |
− | == プログラミング ==
| |
− | [[構造体]]や[[クラス]]の定義をもとに、[[メモリ]]を確保し、初期化処理までを完了したものを「インスタンス」とをいう。
| |
− | | |
− | | |
− | この挙動は[[Objective-C]]がわかりやすい。
| |
− | Objective-Cではメモリ確保(alloc)と初期化(init)の2挙動を明示的に行うようになっている。
| |
− | <syntaxhighlight lang="objective-c">
| |
− | Class* instance = [[Class alloc] init];
| |
− | </syntaxhighlight>
| |
− | | |
− | | |
− | Objective-C以外の多くの[[言語]]では「new」とするだけで一発で行うことができる。
| |
− | このような場合でも内部的にはメモリ確保(alloc)と初期化(init)は別々に実行されている。<syntaxhighlight>
| |
− | Class instance = new Class();
| |
− | </syntaxhighlight>
| |
− | | |
− | ここで注意しなければならないのは「newであっても、内部は2挙動であり、その2挙動は連続実行されるとは限らない」という点である。
| |
− | | |
− | たとえば[[C#]]ではその2挙動は連続実行される。一方で[[Java]]ではnewすると即座にメモリ確保だけは行われるが、初期化はそのインスタンスの「最初の利用時」に実行される。<syntaxhighlight lang="java">
| |
− | // newでメモリ確保が実行される
| |
− | Class instance = new Class();
| |
− | | |
− | // 初回は初期化(コンストラクタ)が実行されたのちHelloメソッドが実行される。
| |
− | instance.Hello();
| |
− | | |
− | // 2回目は普通にHelloメソッドだけ実行される。
| |
− | instance.Hello();
| |
− | </syntaxhighlight>この挙動によりJavaでは[[ダブルチェックロッキング]]が実装できない。
| |
− | | |
− | == 関連項目 ==
| |
− | * [[副作用]]
| |
− | * [[自己参照]]
| |
− | * [[関数ポインタ]]
| |