64 ビット版 RH1FFT2008年07月27日 22:23

今更ですが、RH1FFT の 64 ビット版を作成してみました。
といっても 64 ビットマシンがなくてテストができないので、公開予定はありません。
人柱希望者がいらっしゃるなら、ダウンロードできるようにしてもいいかもしれませんが。

64 ビットになっても、特にすごく良くなるわけではないと思います。
もちろん、現在の 32 ビット版のままでも、64 ビットマシン (の 32 ビット互換モード) で動きます。
2GB を超える WAV ファイルを開くことができるようになりますが、そんなデータありませんよね?
ただ、現在の [録音データ加工] はメモリ喰いなので、数百MB のデータ同士を足し合わせる場合などに影響があるかもしれません。

64 ビット対応2008年07月27日 22:25

 『64 ビット版 RH1FFT』
 http://cessna373.asablo.jp/blog/2008/07/27/3654881
に関連するプログラミングの話です。

64 ビット対応は、必要に応じて INT や DWORD を INT_PTR や DWORD_PTR に置き換えるのが主な作業です。
*_PTR は、64 ビットビルドでは 64 ビット、32 ビットビルドでは 32 ビットの整数としてコンパイルされます。
 『The New Data Types』
 http://msdn.microsoft.com/en-us/library/aa384264(VS.85).aspx
ANSI ビルドと UNICODE ビルド両用の TCHAR みたいなものです。

INT_PTR を INT に代入していたりすると、32 ビットでは問題ないのですが、64 ビットでは桁の切捨てが発生するので問題になることがあります。
それを 32 ビットビルドで検出するために、VisualStudio 2005 には /Wp64 (64 ビット移植性の問題の検出) オプションがあるのですが…これがいまいちです。
まず INT& 引数に INT_PTR を渡しても、INT_PTR& 引数に INT を渡しても、警告が出ません。ちょっとひどすぎますね。

さらに template <typename INT_PTR> と template <typename INT> が同じインスタンスになります。
これにより、例えば
 template <typename T>
 T Max(T lhs, T rhs)
 {
  return lhs < rhs ? rhs : lhs;
 }
のような良くあるテンプレートを定義していると、
 int main()
 {
  INT_PTR i = 0, j = 0;
  INT_PTR k = Max(i, j); // INT_PTR Max(INT_PTR, INT_PTR) のインスタンスが生成される。

  INT i2 = 0, j2 = 0;
  INT k2 = Max(i, j);  // INT_PTR Max(INT_PTR, INT_PTR) が使われる。戻り値の INT_PTR を INT に代入しているので警告。

  return 0;
 }
となったり、
 int main()
 {
  INT i = 0, j = 0;
  INT k = Max(i, j);    // INT Max(INT, INT) のインスタンスが生成される。

  INT_PTR i2 = 0, j2 = 0;
  INT_PTR k2 = Max(i, j);  // INT Max(INT, INT) が使われる。引数で INT_PTR を INT に代入しているので警告。

  return 0;
 }
となったりで、無意味な警告のオンパレードです。しかも使用する順番によって内容が変わります。

さんざん試行錯誤した末、/Wp64 オプションを使うのは止めて、単に x64 プラットフォーム用にクロスコンパイルしました。
 『方法 : Visual C++ プロジェクトを 64 ビット プラットフォーム用に設定する』
 http://msdn.microsoft.com/ja-jp/library/9yb4317s(VS.80).aspx
その結果、手許の環境では実行できない 64 ビット版ができあがったというわけです。
VisualStudio 2008 ではひょっとしたら改善されているかもしれませんが、やはり一番いいのは /Wp64 なんか使わずに、素直に 64 ビットでビルドしてみることですね。