Boost総合スレ part6

このエントリーをはてなブックマークに追加
938デフォルトの名無しさん:2009/01/05(月) 11:53:43
大体関数ポインタを二個挟んで呼び出すのと同等らしい
939デフォルトの名無しさん:2009/01/05(月) 13:21:19
2回分で2〜3倍くらいの時間ならまぁそんなもんかと
思ったんだろうが、5倍超えるとなるとちょっと萎える。
あとfunctionのみでもbindと同じくらい遅くなるんだよね。

ただしfunctionにbindした関数を入れた場合でも、
さらに大幅に遅くなったりはしないのが不思議だった。
940デフォルトの名無しさん:2009/01/05(月) 13:25:39
関数呼び出し単体の時間差を測っても意味無いだろ。
10ns が 50ns になったからって、関数本体の処理が 10us あったらボトルネックにはなり得ない。
941デフォルトの名無しさん:2009/01/05(月) 13:35:38
いやなりえる。
具体的にはエミュレーターとか仮想マシンのオペコードの処理が
関数ポインタの配列になってた部分を、function+bindに変えたらなった。
942デフォルトの名無しさん:2009/01/05(月) 13:37:06
>>941
ちっとも具体的じゃないんだけど、その関数の処理は>940の書いている通り10usも掛かっていたのか?
943デフォルトの名無しさん:2009/01/05(月) 13:41:40
あーすまん。ちゃんと読んでなかった
944デフォルトの名無しさん:2009/01/05(月) 13:58:15
"How much overhead does a call through boost::function incur?"
http://www.boost.org/doc/html/function/faq.html#id2914497
945デフォルトの名無しさん:2009/01/07(水) 14:52:32
だれか、これやろうぜ。
http://vs-e.net/
946デフォルトの名無しさん:2009/01/07(水) 18:06:44
>>945
これってなんだ?
947デフォルトの名無しさん:2009/01/07(水) 18:28:18
宣伝
948デフォルトの名無しさん:2009/01/07(水) 19:14:17
mpl::apply_ifが使えなかったので1.32から1.37にアップグレードしてみました。
結果version.hppの中で#define BOOST_VERSIONが10370になったのですが、やっぱりmpl/apply_if.hppが見あたりません。
grepで探してもapply_ifが見あたらないのですが、apply_ifは何をインクルードすれば使えるのでしょうか。
949デフォルトの名無しさん:2009/01/07(水) 19:21:44
ttp://www.boost.org/doc/libs/1_37_0/libs/mpl/doc/tutorial/renaming-cleanup.html
> The apply_if metafunction has been renamed to eval_if.
950デフォルトの名無しさん:2009/01/07(水) 19:28:21
ありがとうございます。
951デフォルトの名無しさん:2009/01/09(金) 19:07:44
更新しました。
ttp://booster.x0.to/
今回から、DocBook形式のドキュメントもビルドし同梱する様に致しました。
952デフォルトの名無しさん:2009/01/10(土) 11:30:14
953デフォルトの名無しさん:2009/01/10(土) 11:40:36
乙951
954デフォルトの名無しさん:2009/01/10(土) 17:00:40
regex_searchで、後ろから逆順に検索する方法ってありますか?
955デフォルトの名無しさん:2009/01/10(土) 17:05:28
>>954
つreverse iterator
956デフォルトの名無しさん:2009/01/10(土) 17:11:54
さっきからreverse iterator使ってみてるんですが、

boost::regex reg("[0-9a-zA-Z]");
boost::match_results<std::string::iterator> results;
regex_search(str.rend(), str.rbegin(), results, reg);

て事ですよね、なんかコンパイル通らなくて・・・て思ったら

boost::match_results<std::string::iterator> results;
ぢゃなくて
boost::match_results<std::string::reverse_iterator> results;
だった・・・。こんな事で1時間はまるとは・・・・・orz

ありがとうorz
957デフォルトの名無しさん:2009/01/10(土) 17:17:32
reverse iteratorだと1文字のものしかマッチしないんじゃないの?
958デフォルトの名無しさん:2009/01/10(土) 18:59:19
wchar_t
959デフォルトの名無しさん:2009/01/10(土) 19:16:12
lambdaの実装を眺めていて変態だというのはわかったのですが、気になったことがあるので教えてください。
たとえば_1+3とか書くとlambda_functorの中でplus_actionが呼ばれるように理解しましたが、
これは要するに、コンパイラが+演算子を適用する代わりにplus_actionというファンクタを勝手に呼び出してくれてるということですよね。
ということは、(_1%2)*2みたいに書くと二段階にファンクタを呼ぶ=関数ポインタを二回探しに行くという理解で正しいでしょうか?
もしそうならpod型なんかが相手だともったいないと思うのですが、コンパイル時の最適化で吸収してくれてたりするのでしょうか。
なんだか書いていてスレ違いなんじゃないかって気もしてきましたが、よろしくお願いします。
960デフォルトの名無しさん:2009/01/10(土) 19:24:19
>>959
最適化してくれるかどうかなんてコンパイラ依存だろう。
特定の実装について知りたいなら試せばいい。
961デフォルトの名無しさん:2009/01/10(土) 19:36:11
うむむ、なるほど。たしかに言われてみればコンパイラ依存が大きそうな感じですね。
デバッガの使い方いまいち理解できてないんですが、簡単なコードで奮闘してみます。ありがとうございました。
962デフォルトの名無しさん:2009/01/12(月) 16:15:24
1.36のserializer腐ってないか?
963デフォルトの名無しさん:2009/01/12(月) 16:18:02
具体的に
964デフォルトの名無しさん:2009/01/12(月) 17:53:09
BOOST_CLASS_EXPORTを使うと、C2371エラーがでまくる
アホだろこれ
965デフォルトの名無しさん:2009/01/12(月) 18:16:22
ソースを晒せ。
話はそれからだ
966デフォルトの名無しさん:2009/01/12(月) 18:28:08
まあ、たとえばこんな感じでFooを継承したクラスを複数作ったんだが
「error C2371: '`anonymous-namespace'::boost_serialization_guid_initializer_23' : 再定義されています。異なる基本型です。」
とエラーが出るんだよ。ウンコだ

//////////////////////////////////
// Bar.h 派生

#include <boost/serialization/base_object.hpp>

class Bar : public Foo
{
public:
Bar(void);
~Bar(void);

private:
friend class boost::serialization::access ;
template<class Archive> void serialize( Archive& ar, const unsigned int version )
{
ar & boost::serialization::base_object<Foo>(*this) ;
}
} ;

BOOST_CLASS_EXPORT( Bar ) ;
967デフォルトの名無しさん:2009/01/12(月) 18:28:45
ちなみに基底はこれ

//////////////////////////////////
// Foo.h 基底

class Foo
{
private:
friend class boost::serialization::access ;
template<class Archive> void serialize( Archive& ar, const unsigned int version )
{
ar & m_hoge ;
}
} ;
968デフォルトの名無しさん:2009/01/12(月) 19:21:18
自己解決した。
実装をcppのほうに移したらコンパイルが通った。
969デフォルトの名無しさん:2009/01/12(月) 20:46:53
おまえがうんこだったんだろ
970デフォルトの名無しさん:2009/01/15(木) 10:31:43
boost::bind について教えてください

int func(int n1,int n2){
return n1 + n2;
}

std::tr1::function<int(int)> pFunc;
pFunc = bind(&func,20,_1)
↑これは出来るのですが
pFunc = bind(&func,20,_2)
↑これが出来ません。
第二引数を固定するbindはどう記述すればよいでしょうか?
971デフォルトの名無しさん:2009/01/15(木) 10:42:16
>>970
根本的に間違って覚えてないか?
pFunc = bind(&func,_1,20);
でやってみ
972デフォルトの名無しさん:2009/01/15(木) 12:43:44
_1 や _2 はbindが返した関数オブジェクトの何番目の引数かってこと

突っ込まれるのが恐い・・・・
973デフォルトの名無しさん:2009/01/15(木) 13:40:51
やらないか?
974デフォルトの名無しさん:2009/01/15(木) 21:23:03
なにを?
975デフォルトの名無しさん:2009/01/16(金) 02:46:58
>>973 ネタにマジレス
976デフォルトの名無しさん:2009/01/16(金) 02:47:30
あれ >>974 だった
977デフォルトの名無しさん:2009/01/16(金) 09:12:28
>>975
ネタにマジレス乙
978デフォルトの名無しさん:2009/01/16(金) 21:11:08
更新しました。
ttp://booster.x0.to/
979デフォルトの名無しさん:2009/01/17(土) 00:30:51
更新しました。
ttp://boooster.x0.to/
980デフォルトの名無しさん:2009/01/17(土) 03:54:54
ちょっと思い付いたので、boost::any用のMC++D風マルチメソッドを実装してみました。
(実装)ttp://cvs.sourceforge.jp/view/siki/siki/src/holder.hpp?view=markup
(使い方)ttp://cvs.sourceforge.jp/view/siki/siki/src/test/test_holder.cpp?view=markup
上半分がboost::any用ね。

トランポリン関数を事前に登録しなきゃいけないのがちょっと面倒なんだけど、なんか上手い回避方法ある?
981980:2009/01/17(土) 16:14:37
反応無いな……マルチメソッドには興味無いのかな。
上記をポリシーベースに分割してみました。

誰かトランポリン関数の上手い処理の仕方を教えてくれぇ……
982デフォルトの名無しさん:2009/01/17(土) 22:50:13
shared_ptrでカスタムデリータを使おうと思うのですが、デリータの指定を忘れないようにデストラクタをprotectedにして罠をかけました。
でも、派生させるとデストラクタがpublicになってしまうので罠を素通りしてしまいます。deleter指定を忘れないいいようにする方法はありませんか。
#include <boost/shared_ptr.hpp>
using namespace boost;
class Disposable
{
protected:
virtual ~Disposable(){}
virtual void Dispose(){}
public:
static void deleter(Disposable* Obj)
{
Obj->Dispose();
delete Obj;
}
};
class Disposable2 :public Disposable{};

int _tmain(int argc, _TCHAR* argv[])
{
shared_ptr<Disposable> a1(new Disposable(),Disposable::deleter);//エラーにならない OK
shared_ptr<Disposable> a2(new Disposable());//エラーになる ok
shared_ptr<Disposable> a3(new Disposable2(),Disposable::deleter);//エラーにならない OK
shared_ptr<Disposable> a4(new Disposable2());//エラーにならない。bad !!!!!!!
Disposable a5;//エラーになる ok
return 0;
}
983980:2009/01/17(土) 23:27:08
>982
一番簡単なのは、生でコンストラクトするのは禁止して必ずcreate関数で拵えるようにするのじゃない?

class Disposable {
protected:
 void Dispose(){};
 ~Disposable(){};
 struct Deleter {
  template<typename T> void operator()(T* target) {
   target->Dispose();
   delete target;
  };
 };
public:
 static shared_ptr<Disposable> create() {
  return shared_ptr<Disposable>(new Disposable, Disposable::Deleter());
 };
};

class Disposable2 : public Disposable {
public:
 static shared_ptr<Disposable2> create() {
  return shared_ptr<Disposable2>(new Disposable2, Disposable::Deleter());
 };
};
984デフォルトの名無しさん:2009/01/17(土) 23:31:40
ちょっと修正

class Disposable {
protected:
 Disposable(){};
 ~Disposable(){};
 void Dispose(){};
 struct Deleter {
  template<typename T> void operator()(T* target) {
   target->Dispose();
   delete target;
  };
 };
public:
 static shared_ptr<Disposable> create() {
  return shared_ptr<Disposable>(new Disposable, Disposable::Deleter());
 };
};

class Disposable2 : public Disposable {
private:
 Disposable2(){};
 ~Disposable2(){};
public:
 static shared_ptr<Disposable2> create() {
  return shared_ptr<Disposable2>(new Disposable2, Disposable::Deleter());
 };
};

Disposableを抽象クラスにしないのはなんか気になるなぁ……
985デフォルトの名無しさん:2009/01/18(日) 01:12:11
なるほど、createを使ってdeleterを隠蔽するのか。1箇所のクラスの定義でcreateの実装を忘れなければ、多数のインスタンスを作るところでミスらないから問題ないってことですね。
986デフォルトの名無しさん:2009/01/18(日) 01:51:03
そうそう >985
各クラスでcreateを実装し忘れると痛い目に会うけど、newする毎に気を付けるよりはよっぽどマシ。

987デフォルトの名無しさん
createをテンプレート関数にして基底クラスに判定用のメンバ突っ込んで
delete時にcreateを通してないかチェックできるようにすれば多少安全になるんでは