2004年07月15日

メンバ関数テンプレートの部分特殊化 vs オーバーロード

メンバ関数テンプレートの挙動を、とある引数に対してのみ変更したい場合の選択肢としてテンプレートの特殊化オーバーロードがあります。

struct ClassA {
  // メンバ関数テンプレート
  template<typename T> void Func(T value) {
    ...
  }

  // テンプレートの特殊化
  template<> void Func<int>(int value) {
    ...
  }

  // オーバーロード
  void Func(float value) {
    ...
  }
};

優柔不断な自分はここで、テンプレートの特殊化にするかオーバーロードにするか悩みました。
で、それぞれのメリット・デメリットを考えてみました。

テンプレートの特殊化
メリット
・ClassAを定義しているヘッダファイルを変更することなく、新しい特殊化を追加できる。
例えば、

ファイル ClassA.h

struct ClassA {
  // テンプレートメンバ関数
  template<typename T> void Func(T value) {
    ...
  }
};

ファイル ClassAUserImpl.cpp

#include "ClassA.h"

// テンプレートの特殊化
template<> void ClassA::Func<int>(int value) {
  ...
}

ということが可能で、特殊化に関しては「クラスの使用者側で必要になり次第勝手に(自己責任で!)特殊化してください」ということができます。
これはメリットであると共にデメリットにもなりうるかもしれません。

デメリット
・古いコンパイラだとテンプレートの部分特殊化を使用できない。

オーバーロード
メリット
・テンプレートではないのでメンバ関数の実装をインラインに書く必要がない。
・C++の基本なので読みやすい(?)

デメリット
・特になし


ちなみに、テンプレートの特殊化とオーバーロードを同じ型に対して同時に行うとどうなるのかと思って試してみたところ、オーバーロードが優先されました。(VC7.1)

Posted by Akihiro at 15:44 | Comments (3)

2004年07月12日

VisualCでのデバッグTips

VisualCは何年か使ってますが、全然しりませんでした。
あまりの衝撃にこっちにもメモw

クイックウォッチでエラーコードとその内容を表示する

内容がないのもなんなので、追記。

例外が発生した箇所でBreakしたい場合は、「デバッグ」メニューの「例外」で設定することができます。(Visual C++ .NET 2003)
指定した例外以外にも色々な特殊な状況でBreakしたりしなかったりが設定できます。

Posted by Akihiro at 19:20 | Comments (0)

2004年07月08日

GPUによるビデオ処理の簡単な見積もり

1080iのビデオ(解像度は1920 x 1080)のトランジション処理をGPUにさせるとします。

ビデオデータの転送量は
1920 x 1080 x 4Byte(32bpp) x 30fps = 248,832,000 Byte/sec
です。
トランジションは入力が2つ、出力が1つ発生するので、入力に474MB/s、出力に237MB/s、計711MB/sのデータ転送が発生します。

各種バスの転送速度
PCI 33MHz133MB/s
PCI 66MHz533MB/s
AGP 1x266MB/s
AGP 2x533MB/s
AGP 4x1.06GB/s
AGP 8x2.13GB/s
PCI Express 1x500MB/s
PCI Express 2x1GB/s
PCI Express 4x2GB/s
PCI Express 8x4GB/s
PCI Express 12x6GB/s
PCI Express 16x8GB/s
PCI Express 32x16GB/s

単純計算では赤字のバスで転送が間に合いません。
当然ながら様々な要素が絡んでさらに条件は厳しくなると思います。

Posted by Akihiro at 18:06 | Comments (0)