2008年03月09日

boost::function その1

開発環境Visual C++ 2008

boostにはFunctionというライブラリがあります。 一言でいうと強化型関数ポインタですが、結構多機能です。 特にメンバ関数周りの機能が充実していて、以下のようにメンバ関数を格納した上に呼び出すこともできます。

boost::function<void ()> Func;
TestClass Object;
Func = boost::bind(&TestClass::Test, Object);
Func();

最後の行では、Objectを使わないでメンバ関数を呼び出しています。 こんなことをして大丈夫なのか気になりましたので調べてみました。

class TestClass
{
public:
  TestClass(void) {printf("Constructed this=%p\n", this);}
  TestClass(const TestClass& Test) {printf("Copy this=%p from=%p\n", this, &Test);}
  ~TestClass(void) {printf("Destructed this=%p\n", this);}
  void Test(void) {printf("Func this=%p\n", this);}
};

void Test1(void)
{
  boost::function<void ()> Func;
  {
    TestClass Object;
    Func = boost::bind(&TestClass::Test, Object);
  }
  Func();
}

Objectのスコープ外でFunc()を実行してみました。
実行結果は以下の通り。

Constructed this=0012FE5B
Copy this=0012FD54 from=0012FE5B
Copy this=0012FC28 from=0012FD54
Copy this=0012FB20 from=0012FC28
Copy this=0012FC4F from=0012FB20
Destructed this=0012FB20
Destructed this=0012FC28
Copy this=0012FD5C from=0012FC4F
Destructed this=0012FC4F
Destructed this=0012FD54
Copy this=0012FC10 from=0012FD5C
Copy this=0012FB00 from=0012FC10
Copy this=0012F9F8 from=0012FB00
Copy this=0012F8E0 from=0012F9F8
Copy this=0012F7D8 from=0012F8E0
Copy this=0012F6C0 from=0012F7D8
Destructed this=0012F6C0
Destructed this=0012F7D8
Destructed this=0012F8E0
Copy this=0012F8DC from=0012F9F8
Copy this=0012F7B0 from=0012F8DC
Copy this=0012F67C from=0012F7B0
Copy this=0012FC48 from=0012F67C
Destructed this=0012F67C
Destructed this=0012F7B0
Destructed this=0012F8DC
Destructed this=0012F9F8
Destructed this=0012FB00
Destructed this=0012FC10
Copy this=0012FBE0 from=0012FC48
Destructed this=0012FC48
Copy this=0012FE70 from=0012FBE0
Destructed this=0012FBE0
Destructed this=0012FD5C
Destructed this=0012FE5B
Func this=0012FE70
Destructed this=0012FE70

たくさんコピーが行われているようです。ちょっとびっくり。 Func()実行時の出力はFunc this=0012FE70です。 デストラクタは一番最後に呼び出されているようですので、Func()実行時はオブジェクトは存在するようです。
おそらく、FuncオブジェクトがObjectのコピーを保持しているのでしょう。

次回に続きます。

投稿者 MASATO : 2008年03月09日 21:11 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?