« 脛をかじらない人生 | トップページ | 結論→食える時にちゃんと食おう »

2010年11月 2日 (火)使ってみなイカ?

おはようございます。 本日の当番 プログラマのT.Yです。
前回コンデンサを交換した電源ちゃんを搭載したPCは・・・

CPUを6コアへ
メモリをDDR3へと
そしてマザーボードもS-ATA3.0やUSB3.0等の最新規格に対応した新製品に交換されたりしつつも元気よく稼働中で御座います。


さて、本日はプログラマらしくプログラムネタで参ろうと思います。


仕事でプログラムやってるとSDKのサンプルコードやらでいろんなコードを見かけるわけです。
いきなりですが、下の奴何やってるかわかります?

フィーリングで雰囲気だけ似せてます。

CallQueueというクラスと、CallInterfaceというシングルトンクラスがあり、GetInstanceでインスタンスを受け取る物と思ってください。

↓コレ
class CallList
{
public:
   
   vector m_Queue;
   
   void CallAll( void )
   {
      for_each(
         m_Queue.Begin(),
         m_Queue.End(),
         CallFunctor( CallInterface::GetInstance() )
         );
   }
};



ここの、CallAllの中の処理わかります?
私は最初頭の上に???がいっぱいでしたw

で、調べていくとちょっと面白かったのでここで書いていこうと思います。


CallFunctorの部分ですが、実装はこんな感じです。


struct CallFunctor : public std::unary_function< CallQueue&, void >
{
   CallFunctor( CallInterface* caller ) : m_pCaller( caller ){};
   
   void operator()( CallQuene& que )
   {
      m_pCaller->Call( que );
   }
   
   CallInterface* m_pCaller;
};



さてコレですが、ナニがしたいのかここでもよく分かりません。 よね? もしかして私だけ?

ここで普段見かけない、「std::unary_function」というのをネットの先生に質問すると「関数アダプタ」という奴らしいです。

詳しくは同じようにネットで調べてください。
ここから下の奴のもっと詳しい奴やらいろいろ出てきます。

最初のCallFunctorの部分の処理を普段見かける形状に戻していくと。。。

void CallAll( void )
{
   CallFunctor func( CallInterface::GetInstance() );
   for( int i=0; i< m_Queue.size(); i++ )
   {
      func( m_Queue[i] );
   }
}


そもそもこうなったところで、「だから何?」と私はなりました。
なぜ、こんな書き方をする必要があるのか理解できませんでした。
そのあと最終的に納得のいく結論にたどり着いたのは・・

たとえば極端な例として

void Function( int a, int b, int c, int d, int e, int f, Object* obj )
{
// 処理
}


とあるような関数が、forループなどで呼ばれるような場所で、
forループ内で変わる引数は7個ある引数のうちobjだけとかの場合。


struct ObjFunc : std::unary_function< Object*, void >
{
   ObjFunc( int a, int b, int c, int d, int e, int f ):
   ma(a), mb(b), mc(c), mf(f){}
   
   void operator()( Object* obj )
   {
      // 処理
   }
   
   int ma, mb, mc, md, me, mf;
};

ObjFunc func( a, b, c, d, e, f );
for( int i=0; i< 1000; i++ )
{
func( &obj[i] );
}

↑ループの回数とか引数とか適当ね。


なんてすると、毎回呼び出す関数の引数を実際可変する1つだけに減らす事ができちゃいます。
これ、結構スマートに見えてきません?

私はこれを想像しつつ「へぇ」と関心して納得しました。


ぱっと使い先で思いついたのが。。。

昔学生時代に、手製でポリゴン書いてた時なんかの・・・

そう、最終的にポリゴン単位で転送先に描画する周りの関数あたりが呼び出し回数はそのままメッシュのポリゴン数な訳で、

そう言うところで、描画先のデータや、クリップ座標やらの情報を事前に設定して、引数には必要最低限にしておけば良かったなと。。。

ただ、今は殆どハードウェアでやってくれるような事なので、プログラマが細かくそんなところを触る利点っていうのもねぇ。。。
触るにしても、こんな高級言語で触れないですし。。

他はといえば・・・どこでも使って良くなるような代物でも無いので・・・
うーん・・・どうしよう?

ということで、これ見て「ここに使ってみたら・・」なんて思った人は


使ってみなイカ?

follow us in feedly
result = encodeURIComponent( "http://www.accessgames-blog.com/blog/2010/11/post-d291.html" );document.write( "result = " , result );&media=https%3A%2F%2Ffarm8.staticflickr.com%2F7027%2F6851755809_df5b2051c9_z.jpg&description=Next%20stop%3A%20Pinterest">

| | コメント (0) | トラックバック (0)

« 脛をかじらない人生 | トップページ | 結論→食える時にちゃんと食おう »

プログラマー」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: 使ってみなイカ?:

« 脛をかじらない人生 | トップページ | 結論→食える時にちゃんと食おう »