C++Builder開発手法」で技術的なコメントを述べさせて頂きましたが、その際にC++Builderの32ビットアプリケーションを64ビット化する場合には、細々とした注意点があるとご説明しました。その注意点について、このブログ記事でフォローアップさせていただきます。T5のセッションのビデオ視聴や資料のダウンロードは下記のURLより行なえます。(公開され次第追記します)アライメントの違いに注意する32-bit向けのアプリを64-bitコンパイラで単にビルドするとアライメントの不整合によってデータが正しく扱えない場合があります。この代表的な例はC言語の構造体をデータの入出力に用いている場合です。C++言語はC言語がベースですが、C言語は「高級アセンブラ」と称されるくらいにCPUのアーキテクチャに依存したコードを記述できます。この特徴はC++言語にも引き継がれています。ポインタやビット演算はその最たる部分です。C言語はC++言語と互換性が高いので、C言語で書かれたコードをC++言語のプロジェクトで再利用するのは良くある手法です。(過去に自分も何度も経験があります)またデータをファイルへ入出力するときに構造体で持つデータのイメージをそのままファイルに入出力するという実装も良く用いられます。Windowsのビットマップファイル(*.bmp)が有名な例です。同じ構造体を32-bitと64-bitで扱う場合にアライメントがどのように変わるかを実験をしてみましょう。このような構造体があります。h;};この構造体の情報をC++Builderのアプリケーションフォームに表示させることにします。TButtonとTMemoを貼り付けて、TButtonのクリックでTMemoに構造体のアライメントを出力するようにしましょう。64ビットの2種類で切り替えてビルドし、TMemoに出力される結果を確認しましょう。32-bitの場合は次のように出力されます。52これに対して64-bitの場合は次のように出力されます。40同じソースコードでも、ビルドターゲットの違いにより結果が一致しないことが確認できました。アライメントが異なりますし、構造体自体のサイズも異なっています。doubleに着目してみましょう。32-bitでは10バイトであるのに対し、64-bitでは8バイトと小さくなっていることが分かります。この構造体をそのままファイルに入出力していると、32-bit版と64-bit版のアプリでは同じデータファイルを扱うことができなくなります。この例は非常に極端ですが、昔からの「秘伝のコード」を使っていると良くあることです。アプリケーションの64-bit化では、単にデータ型の変換に注意するだけではなく、このような部分を精査して適切なリファクタリングを実施することが必要です。古いC++Builderのバージョンでは、Windowsハンドルなどの関係で、マクロNO_STRICTを有効にしてメソッド呼び出しの厳密な型チェックを行っていない場合がありました。Rioでは、この定義自体が削除されます。このことによりコンパイル時に厳密な型チェックが実施され、メソッドや関数呼び出し時の型安全性が担保されるようになります。linkで利用するテクニックがあります。linkの見直しも必要です。?あ、_tWinMainに戻り値型の宣言がない。