従来、Windows開発では、リソースファイルは実行可能バイナリに直接埋め込まれていました。この特定のリソースへのアプローチはWindowsの外で多く使われているとは思えませんが、Javaは実行可能なビットと共に圧縮されたアーカイブにリソースを格納することで同じことをするクロスプラットフォームの方法を持っています。 APKファイルにリソースが埋め込まれているAndroid開発でも同じことが分かります。 XMLを使用してリソースを指定するのはかなり一般的です(Windowsのバイナリを除く)。
リソースを実行可能ファイルにパッケージ化することは、「単一ファイル解決策」を提供する利点があります。実行可能ファイルにはアプリケーションロジックとサポートリソースがすべて1つのファイルにバンドルされています。これはいくつかの状況で役に立ちますが、単一のファイルとして配布可能な実質的なアプリケーションを見つけるのは非常にまれです。いずれにしても、リソースをパックするこの方法は、Windows開発の初期段階に戻ります。マイクロソフトはおそらく、その時代の他のデスクトップマイクロプラットフォームでは一般的だったアプローチを引き出していたのではないかと思われます。
リソースでは、コードではなく宣言的に指定することができます。通常はユーザーインターフェイス要素です。便利な機能は、これらの宣言的な要素をロケール依存にすることです。たとえば、英語のメインメニュー、フランス語のメニューなどを指定し、実行時に適切なメニューを選択することができます。
グラフィカルデザインツールでコードよりも宣言的なリソースファイルを作成して編集する方が簡単ですが、コードを直接出力することは不可能ではありません。いずれにしても、ユーザーインターフェイス要素をアプリケーションロジックから分離することは、通常「より良い」と考えられています。慎重に設計することで、アプリケーション自体が完成した後にユーザーインターフェイスのビットやその他のリソースを編集し、個別にメンテナンスすることができます。
従来のWindowsリソースは、リソースコンパイラによって圧縮バイナリ形式にコンパイルされ、その形式でオブジェクト(.obj、.o)ファイルにポックされ、リンカによって実行可能ファイルにリンクされます。現代の開発ツールでは、すべてのものが完全に隠されており、最終的な実行可能ファイルが表示されていると考えられます。 Windows APIは、実行可能ファイルからリソースを解凍し、プログラムによる表現に変換する方法を認識しています。コードではなく、他のAPI呼び出しで使用できるメモリ内のデータです。
私の経験では、XMLベースのリソースの処理は少し遅くなる可能性がありますが、Windows(バイナリ)リソースには明示的なコーディングよりも大きなオーバーヘッドがありません。
ユーザーインターフェイスのコーディングは、通常、リソースを使用するよりも柔軟性があります。両方のアプローチが同じアプリケーションで使用されるのは珍しいことではありません。
これは意味があります。 RCファイルに "101 icon.ico"のようなものを書くと、icon.icoデータがバイナリにコンパイルされ、LoadIcon(...、101)を呼び出すと、ウィンドウはそのデータを使って私にIconオブジェクトを作成して返しますか?私はオブジェクトがオンデマンドで読み込まれ、起動時に一度に読み込まれるとは限りません。それはかなり合理的かつ有用であるようです。 –
私の想起は、実行可能ファイルの関連セクション(リソースを含むセクション)が実際にメモリにマップされることです。したがって、リソースの読み取りは、実行可能ファイルがロードされた後のファイル操作ではなく、メモリ操作です。私は、アイコンとメニューはコンパイルされたリソースファイルの内容にほぼ正確にマップされたメモリ内のデータ構造を持っていると考えているので、メモリにマップされたデータはほぼそのまま使用できます。ただし、これはWindowsのバージョンによって異なる場合があります。 –