2004年7月16日金曜日

メンバ関数テンプレートの部分特殊化 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)

2004年7月13日火曜日

VisualCでのデバッグTips

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

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

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

2004年7月9日金曜日

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


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

  © Blogger template 'Isolation' by Ourblogtemplates.com 2008

Back to TOP