ページ「NoxPlayer」と「インスタンス」の間の差分
imported>Administrator |
imported>Administrator |
||
1行目: | 1行目: | ||
− | ''' | + | '''インスタンス'''([[英語]]:instance)とは、「実体」のことである。 |
− | + | == アプリケーション == | |
+ | [[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では[[ダブルチェックロッキング]]が実装できない。 | ||
+ | |||
+ | == 関連項目 == | ||
+ | * [[副作用]] | ||
+ | * [[自己参照]] | ||
+ | * [[関数ポインタ]] |
2019年10月11日 (金) 02:29時点における最新版
インスタンス(英語:instance)とは、「実体」のことである。
アプリケーション[編集 | ソースを編集]
ROMやHDDの中に格納されているアプリ(プログラム)がRAMに読み込まれ実行可能な状態になったものを「インスタンス」という。
現実的には、上記のようにプログラムがRAMに読み込まれ、実行が開始され、ある程度の初期化を済ませた状態を指すことが多い。
この初期化処理の際に「同名のアプリが起動しているか」をチェックして終了するものを「シングルインスタンス」、チェックしないものを「マルチインスタンス」などと呼ぶ。
Windows[編集 | ソースを編集]
Windowsはマルチインスタンスが基本となっている。スタートメニューやタスクバーのアイコンをクリックすると次々と同じアプリが立ち上がる。
このため多くのプログラマーが「多重起動防止する方法」を調べるのが定番となっている。
AndroidやiOS[編集 | ソースを編集]
AndroidやiOSはシングルインスタンスが基本となっている。スマホという特性上こちらのほうが使い勝手がいいからだ。
このため多くのゲーマーがチートするために「マルチインスタンス化する方法」を調べているようだ。
プログラミング[編集 | ソースを編集]
構造体やクラスの定義をもとに、メモリを確保し、初期化処理までを完了したものを「インスタンス」とをいう。
この挙動はObjective-Cがわかりやすい。
Objective-Cではメモリ確保(alloc)と初期化(init)の2挙動を明示的に行うようになっている。
Class* instance = [[Class alloc] init];
Objective-C以外の多くの言語では「new」とするだけで一発で行うことができる。
このような場合でも内部的にはメモリ確保(alloc)と初期化(init)は別々に実行されている。
Class instance = new Class();
ここで注意しなければならないのは「newであっても、内部は2挙動であり、その2挙動は連続実行されるとは限らない」という点である。
たとえばC#ではその2挙動は連続実行される。一方でJavaではnewすると即座にメモリ確保だけは行われるが、初期化はそのインスタンスの「最初の利用時」に実行される。
// newでメモリ確保が実行される
Class instance = new Class();
// 初回は初期化(コンストラクタ)が実行されたのちHelloメソッドが実行される。
instance.Hello();
// 2回目は普通にHelloメソッドだけ実行される。
instance.Hello();
この挙動によりJavaではダブルチェックロッキングが実装できない。