64bitプログラミングで気をつけること

実はそんなに無いみたい。
わんくま勉強会で聞きました。
聞き間違ってたらごめんなさい。

64bitってどういうこと?

  • 命令コードが64bitである

windowsのメモリ管理

  • 32bit版では4Gまで
    • ユーザー領域:2G
    • システム領域:2G
    • /3gbオプションとかいろいろ回避策はあるがどれも一般的ではない
  • 64bitだと16E(エクサ)Bまで対応
    • でもユーザー領域は8TB(IA64では7TBまで)
    • 今後変わっていくかも
  • エディションでサポートメモリが違う
OS エディション サポートメモリサイズ
server 2008 R2 Enterprise etc 2T
  Foundation 8G
  web/standerd 32G
windows 7 Ultimate 192G
  Home premium 16G
  HomeBasic 8G

一般的な注意点

インストールパスが32bit/64bitアプリで変わる
  • 64bitOSで32bitアプリケーションはc:\program files(x86)になる
    • 32bitOSで32bitアプリケーションは%programfiles%はc:\program filesになる
      • SHGetFolderPath
      • SystemEnviroment.GetFolderPath
      • FileSystemObject.GetSpecialFolder
  • 64bitアプリは今まで通りc:\program files
インストーラーはターゲットプラットフォームごとに用意するのが基本
  • 3環境
    • x86
    • x64
    • ia64
      • コンシューマ向けにはない
      • 学術向け
  • 1つにすることも可能だけどmsiが3倍サイズになるので現実的ではない
  • install.exeやsetup.exeの自動昇格は64ビットプロセスではありません
    • vista
ファイルシステムリダイレクタという機能がある
  • 64bitOSで32bitアプリケーションがアクセスすると自動的にリダイレクトされる
    • %windir%system32にアクセスしようとすると%windir%SysWOW64になる
    • ここに32bit版の各DLLが入っている
レジストリリダイレクタ
  • 64bitOSで32bitアプリケーションがアクセスすると自動的にリダイレクトされる
    • HKLM\SOFTWARE
      • HKLM\SOFTWARE\
    • HKCU\SOFTWARE
      • HKCU\SOFTWARE\Wow6432Node
      • ※ただしHKCUは反映される
一番大事なこと
  • 32bitアプリでは32bitなバイナリしか呼び出せない
  • 64bitアプリでは64bitなバイナリしか呼び出せない
    • アクセス空間が違うのもあるが、それ以外にも理由がある
  • 32bitなCOMがあったりすると、その時点でユーザーアプリケーションは64bitで作成することができません
AccessはもうSQL Serverにシフトされてきている
  • DAO(Data Access Object)一般的にはAccessと呼ばれている
  • .mdb .accdbへのアクセスが提供されない
  • .mdbを読み込みたい場合は32bitにしなくてはいけない
    • っていうかもう使うなということ
X64モジュールのインストール
  • VisualStudio 2008のデフォルトインストールでは入らないので注意
  • 方法:VisualC++プロジェクトを64ビットプラットフォーム用に設定する
整数型のサイズ
  • C++の場合、intは各処理系で最も使いやすいサイズにすることになっていますが、今回x64への移行ではintのサイズは変更されなかった
32bit/64bit windows
int 32
long 32
longlong 64
64bit unix系(予定?)
int 32
long 64
longlong 64
64bitでエラーになる例
long x = 10L
int i = (int)&x
printf("%ld",:(long*)i);

回避策は以下のどれかを使うこと

  • long*
  • void*
  • INT_PTR
  • intptr_t
呼び出し規約が統一された(関数の値の渡し方(アセンブリレベルでの話))
  • 呼び出し規約には3種類ある
    • __stdcall
    • __cdecl
    • __fastcall
      • 64bitではこれに統一された
.NETの場合気をつけること
  • VisualStudio2008は標準でプロジェクトを作成するとターゲットがAnyCPUになっている
  • AnyCPUの場合、プラットフォームに合わせて実行環境が切り替わる
  • x86で動くのにx64で動かないーという現象の原因になることがある
  • ターゲットはきっちり設定しましょう
その他
  • 一般ユーザーでx64になって困ることはほとんどない
    • 対応してないドライバーとかは例外
    • XPの64bitがでたときにいろいろ議論されたが、 あまり意識することはすくないので今となってはあまり記事数はない
  • vistaからUAEが入っており、通常の32bitアプリケーションは仮想化されている
  • 64bitアプリで%programfiles%に書き込みを行いたい場合はmaniest...がほにゃほにゃ・・・聞き逃した

ネタ元

参考