Delphi におけるマルチデバイス アプリケーションについての考慮事項
マルチデバイス アプリケーションについての考慮事項 への移動
目次
- 1 64 ビット Windows システムでは Extended データ型のサイズは 2 バイト小さい
- 2 OS X でのスタック アラインメントの問題
- 3 Win32 から OS X への Delphi アプリケーションの移行
- 4 Win32 から Win64 への Delphi アプリケーションの移行
- 5 デスクトップからモバイルへの Delphi アプリケーションの移行
- 6 Win64 では Delphi と C++Builder との相互運用機能で 'absolute' キーワードがサポートされていない
- 7 64 ビット版 Windows でのインライン アセンブリの制限
- 8 関連項目
64 ビット Windows システムでは Extended データ型のサイズは 2 バイト小さい
Extended データ型のサイズは、以下のように、Win64 と Win32 では異なります。
- Win64 では、Extended 型は Double(8 バイト)のエイリアスです。
- Win32 では、Extended 型は(依然として)10 バイトです。
このように、Win64 で Extended データ型を使用する場合は、Win32 に比べて精度が低くなります。アプリケーションで浮動小数点演算などに Extended データ型を使用しており精度に頼っている場合は、サイズのこのような違いはデータに影響を及ぼすおそれがあります。
非常に小さい値や非常に大きい値が最も影響を受けます。これら 2 つのデータ型の精度は次のようになります。
- 1x10308 IEEE Double(Win64 でサポート)
- 1x104932 IEEE Extended(Win32 でサポート)
コード ベースに Extended データ型が含まれている場合は、"W1066 Extended 型の浮動小数値の精度が失われます。Double 型に丸めました" というヒント メッセージが表示されます。拡張精度浮動小数点演算は 32 ビット アプリケーションでサポートされており、64 ビット アプリケーションではサポートされていません。Win64では、Extended 型の変数を扱う浮動小数点演算は倍精度型に丸められます。
拡張精度浮動小数点変数を扱うために TExtended80Rec レコードを使用できます。ただし、メモリからの読み書きと低レベルの変更(仮数部、指数部、または符号の変更)しか実行できません。
64 ビット データ型についての詳細は、「64 ビット Windows データ型と 32 ビット Windows データ型の比較」を参照してください。
OS X でのスタック アラインメントの問題
OS X アプリケーションの場合、すべてのメモリ データを 16 バイト境界にスタック整列させなければならないという要件が 1 つの大きな問題になります。
- 詳細については、Eli Boling のブログ http://blogs.embarcadero.com/eboling/2009/05/20/5607 を参照してください。
- {{{{Delphi}}}} アプリケーションについては、コードのアラインメント 指令を使用して、16 バイト境界を設定できます。
- ALIGN_STACK 定義(「条件付きコンパイル(Delphi)」内)も参照してください。
Win32 から OS X への Delphi アプリケーションの移行
RAD Studio のさまざまなライブラリによるプラットフォーム サポートの状況を以下の表にまとめます。
ライブラリ/プラットフォーム | Win32 | Win64 | Mac OS X |
---|---|---|---|
FMX |
○ |
○ |
○ |
RTL |
○ |
○ |
○ |
VCL |
○ |
○ |
サポートされていません |
メモ: この表は、ライブラリによるプラットフォーム サポートの状況を大まかに示したものにすぎません。 RTL と VCL については、特定プラットフォームのサポートで一部例外があります。たとえば、BDE は Win64 でも Mac OS X でもサポートされていません。
VCL は Windows 専用であり、OS X をサポートしていません。OS X をターゲットとするアプリケーションは、FireMonkey(FMX)を使って作成しなければなりません。
一方、Delphi ランタイム ライブラリ(RTL)の大部分は、サポートされているターゲット プラットフォームをすべてサポートしています。RTL には System、SysUtils、IOUtils の各ユニットなどが含まれており、これらには、プラットフォームに依存しない要素が用意されています。
- (VCL ではなく)RTL のみ使用する Delphi アプリケーションは、ほとんど変更せずに OS X(および Win64)で動作します。
- VCL や RTL を使用する Delphi アプリケーションはすべて、Win32 と Win64 の両方をサポートします。
RTL についての詳細は、「RTL(ランタイム ライブラリ)の利用」を参照してください。
FireMonkey についての詳細は、「FireMonkey アプリケーション プラットフォーム」を参照してください。
VCL についての詳細は、「ビジュアル コンポーネント ライブラリ(VCL)の導入」を参照してください。
Win32 から Win64 への Delphi アプリケーションの移行
VCL と RTL は Win32 でも Win64 でもサポートされています。
Delphi Win64 アプリケーション開発の詳細は、「64 ビット Windows アプリケーション開発」を参照してください。
デスクトップからモバイルへの Delphi アプリケーションの移行
Win64 では Delphi と C++Builder との相互運用機能で 'absolute' キーワードがサポートされていない
Clang ベースの C++ コンパイラとの相互運用機能を実行する Delphi コードを記述する場合は、どの Clang ベース C++ コンパイラとの相互運用機能を実行するときも、Delphi アプリケーションの interface セクションでは Delphi 指令/キーワード "absolute" を使用できません。ただし、implementation セクションでは "absolute" キーワードを使用できます。
LLVM では、変数を別の変数にオーバーレイする仕組みを提供していないため、C++Builder では変数ごとに一意なシンボルを前提とします。
64 ビット版 Windows でのインライン アセンブリの制限
ユーザーのコード ベースにインライン アセンブリ コードが含まれる場合は、64 ビットに移行するためにコードを変更する必要があります。詳細は、以下のトピックを参照してください。